提取指定目录中所有文件及其路径

10 投票
2 回答
21586 浏览
提问于 2025-04-17 07:00

我有一个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]))

撰写回答