从tar中仅提取单个目录

gau*_*rav 9 python tar

我正在使用python中的一个项目,我只需要提取tar存档的子文件夹而不是所有文件.我试着用

tar = tarfile.open(tarfile)
tar.extract("dirname", targetdir)
Run Code Online (Sandbox Code Playgroud)

但这不起作用,它不提取给定的子目录也没有抛出异常.我是python的初学者.另外如果上面的函数对目录不起作用,那么这个命令和tar.extractfile()之间的区别是什么?

tal*_*nat 14

tarfile模块文档的第二个示例的基础上,您可以使用以下内容提取包含的子文件夹及其所有内容:

with tarfile.open("sample.tar") as tar:
    subdir_and_files = [
        tarinfo for tarinfo in tar.getmembers()
        if tarinfo.name.startswith("subfolder/")
    ]
    tar.extractall(members=subdir_and_files)
Run Code Online (Sandbox Code Playgroud)

这将创建子文件夹及其内容的列表,然后使用推荐的extractall()方法仅提取它们.当然,替换"subfolder/"为要提取的子文件夹的实际路径(相对于tar文件的根目录).


Sam*_*ull 7

另一个答案将保留子文件夹路径,这意味着subfolder/a/b将被提取到./subfolder/a/b.要将子文件夹提取到根,所以subfolder/a/b将被提取到./a/b,您可以使用以下内容重写路径:

def members(tf):
    l = len("subfolder/")
    for member in tf.getmembers():
        if member.path.startswith("subfolder/"):
            member.path = member.path[l:]
            yield member

with tarfile.open("sample.tar") as tar:
    tar.extractall(members=members(tar))
Run Code Online (Sandbox Code Playgroud)

  • 效果很好。您还可以通过执行`member.path = os.path.join('new_dirname', member.path[l:])`来重命名顶级文件夹 (2认同)