提取指定目录中所有文件及其路径
我有一个tar压缩包,里面有一个我需要提取的文件夹。比如说,我的文件夹路径是:
TarPrefix/x/y/z
我想把它提取到一个指定的目标文件夹,比如说:extracted/a/。提取后,这个文件夹应该包含TarPrefix/x/y/z里面的所有文件和子文件夹。
subdir_and_files = [ tarinfo for tarinfo in tar.getmembers()
if tarinfo.name.startswith("subfolder/")
]
我想先获取路径“subfolder/”下所有文件和文件夹的列表,然后用 tar.extractall(extracted/a,subdir_and_files)
来提取。但是这样提取出来的文件夹结构会保留原来的路径,比如最后的结果是 extracted/a/x/y/z。你能帮我把这些文件提取到指定的文件夹里吗?
2 个回答
4
在编程中,有时候我们需要处理一些数据,比如从一个地方获取数据,然后对这些数据进行操作。这个过程可能会涉及到很多步骤,比如读取文件、处理数据、然后再把结果保存到另一个地方。
有些时候,我们会遇到一些错误或者问题,这时候就需要去查找原因。比如,可能是因为数据格式不对,或者是代码中有一些小错误。解决这些问题通常需要仔细检查代码,看看哪里出了问题。
在这个过程中,使用一些工具或者库可以帮助我们更高效地完成任务。这些工具就像是我们编程时的助手,可以让我们更快地找到解决方案。
总之,编程就像是解决谜题,我们需要一步一步地找出答案,直到问题解决为止。
with tarfile.open('sourcefile.tgz', 'r:gz') as _tar:
for member in _tar:
if member.isdir():
continue
fname = member.name.rsplit('/',1)[1]
_tar.makefile(member, 'desination_dir' + '/' + fname)
17
看起来你可能已经找到答案了,不过我还是想分享一下我的版本:
import sys, tarfile
def get_members(tar, prefix):
if not prefix.endswith('/'):
prefix += '/'
offset = len(prefix)
for tarinfo in tar.getmembers():
if tarinfo.name.startswith(prefix):
tarinfo.name = tarinfo.name[offset:]
yield tarinfo
args = sys.argv[1:]
if len(args) > 1:
tar = tarfile.open(args[0])
path = args[2] if len(args) > 2 else '.'
tar.extractall(path, get_members(tar, args[1]))