从tar中提取单个目录(用python)

12 投票
2 回答
18175 浏览
提问于 2025-04-17 05:38

我正在做一个Python项目,需要从一个tar压缩包中只提取一个子文件夹,而不是所有的文件。
我尝试使用了

tar = tarfile.open(tarfile)
tar.extract("dirname", targetdir)

但是这个方法不管用,它没有提取出指定的子目录,而且也没有抛出任何异常。我还是Python的初学者。
另外,如果上面的函数对目录不管用,那这个命令和tar.extractfile()有什么区别呢?

2 个回答

16

另一个回答会保留子文件夹的路径,这意味着 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))
22

在这个例子中,我们是基于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)

这个代码会创建一个包含子文件夹及其内容的列表,然后使用推荐的extractall()方法来提取它们。当然,你需要把"subfolder/"替换成你想提取的子文件夹的实际路径(相对于tar文件的根目录)。

撰写回答