Python 将所需文件移到需要的位置
我正在编写一个Python脚本,该脚本解压压缩目录并安装一些文件。解压压缩文件时,可能会有Python 将所需文件移到需要的位置,python,file,directory,move,Python,File,Directory,Move,我正在编写一个Python脚本,该脚本解压压缩目录并安装一些文件。解压压缩文件时,可能会有/usr/bin/package或/var/lib/package等文件。解压后的目录包含实际需要到达的目录的名称。假设目录结构如下所示: ./zippedfile.zip ./usr /bin /package ./var ./lib ./package ./zippedfile.zip /美国 /垃圾箱 /包装 /var /lib /包 现在我需要将
/usr/bin/package
或/var/lib/package
等文件。解压后的目录包含实际需要到达的目录的名称。假设目录结构如下所示:
./zippedfile.zip
./usr
/bin
/package
./var
./lib
./package
./zippedfile.zip
/美国
/垃圾箱
/包装
/var
/lib
/包
现在我需要将所需文件移动到需要的位置。例如,我需要将/usr/bin/package
移动到实际的/usr/bin/
目录。问题是,无法预测可能存在哪些文件夹,因此脚本需要找到所需的目录并移动它们。谢谢,希望我能把问题说清楚。使用zipfile模块读取zip文件,然后提取(name,dest)
提取每个文件。例如:
import sys
import zipfile
def unzip(path, root='/'):
zh = zipfile.ZipFile(path, 'r')
for name in zh.namelist():
zh.extract(name, root)
zh.close()
unzip(sys.argv[1])
如果zip中的文件路径为/usr/bin/script
,则该文件将被提取到/usr/bin/script
用法:
% python unzip.py myfiles.zip
更新:要处理TAR,请使用。这将使用文件扩展名(gzip、bzip2)检测压缩类型:
已更新如果无法使用zipfile或tarfile模块,则可以调用相应的系统命令以获得相同的结果:
import os
import subprocess
import sys
def untar(path, root):
subprocess.call(['tar', '-C', root, '-xf', path])
def unzip(path, root):
subprocess.call(['unzip', os.path.abspath(path)], cwd=root)
path = sys.argv[1]
dest = os.path.abspath(sys.argv[2])
if not os.path.exists(dest):
os.makedirs(dest)
if path.endswith('.zip'):
unzip(path, dest)
else:
untar(path, dest)
使用zipfile模块读取zip文件,并提取(name,dest)
提取每个文件。例如:
import sys
import zipfile
def unzip(path, root='/'):
zh = zipfile.ZipFile(path, 'r')
for name in zh.namelist():
zh.extract(name, root)
zh.close()
unzip(sys.argv[1])
如果zip中的文件路径为/usr/bin/script
,则该文件将被提取到/usr/bin/script
用法:
% python unzip.py myfiles.zip
更新:要处理TAR,请使用。这将使用文件扩展名(gzip、bzip2)检测压缩类型:
已更新如果无法使用zipfile或tarfile模块,则可以调用相应的系统命令以获得相同的结果:
import os
import subprocess
import sys
def untar(path, root):
subprocess.call(['tar', '-C', root, '-xf', path])
def unzip(path, root):
subprocess.call(['unzip', os.path.abspath(path)], cwd=root)
path = sys.argv[1]
dest = os.path.abspath(sys.argv[2])
if not os.path.exists(dest):
os.makedirs(dest)
if path.endswith('.zip'):
unzip(path, dest)
else:
untar(path, dest)
据我所知,您需要的大部分是标准库中的os.path
模块。这里有一些有用的功能:
- :如果路径引用现有路径,则返回True。对于断开的符号链接,返回False。在某些平台上,如果未授予对请求文件执行os.stat()的权限,则此函数可能返回False,即使路径实际存在
- :如果路径是现有目录,则返回True。这遵循符号链接,因此对于同一路径,islink()和isdir()都可以为true
如果需要调用shell命令来实际移动目录,那么也可以在标准库中使用子流程
模块()
希望这有帮助。据我所知,您需要的大部分内容都在标准库的os.path
模块中。这里有一些有用的功能:
import zipfile, os
zipped = zipfile.ZipFile('zippedfile.zip')
os.chdir('/')
zipped.extractall()
- :如果路径引用现有路径,则返回True。对于断开的符号链接,返回False。在某些平台上,如果未授予对请求文件执行os.stat()的权限,则此函数可能返回False,即使路径实际存在
- :如果路径是现有目录,则返回True。这遵循符号链接,因此对于同一路径,islink()和isdir()都可以为true
如果需要调用shell命令来实际移动目录,那么也可以在标准库中使用子流程
模块()
希望这能有所帮助。一切都与/那么相关吗?是的。如果我有文件/usr/bin/package
,我想将其移动到/usr/bin/package
中,所有内容是否都与/then相关?是的。如果我有文件/usr/bin/package
我想把它移到/usr/bin/package
好的。有什么方法可以做到这一点,比如说一个tarred文件,而不仅仅是一个zip文件?谢谢。没有任何额外的模块,如tarfile或zipfile,有没有办法做到这一点?很酷,很高兴它的帮助。我用一个调用系统命令提取归档文件的例子更新了答案。啊,很有趣。它会在不覆盖关键系统文件的情况下将它们移动到需要的位置?您需要使用tarfile/zipfile解决方案,在读取每个文件时,使用os.path.exists()确定路径是否已经存在,然后再提取和覆盖它。啊,好的。有什么方法可以做到这一点,比如说一个tarred文件,而不仅仅是一个zip文件?谢谢。没有任何额外的模块,如tarfile或zipfile,有没有办法做到这一点?很酷,很高兴它的帮助。我用一个调用系统命令提取归档文件的例子更新了答案。啊,很有趣。它会在不覆盖关键系统文件的情况下将它们移动到需要的位置?您需要使用tarfile/zipfile解决方案,在读取每个文件时,使用os.path.exists()确定路径是否已经存在,然后再提取和覆盖它。
import zipfile, os
zipped = zipfile.ZipFile('zippedfile.zip')
os.chdir('/')
zipped.extractall()