从tar中仅提取单个目录

时间:2011-11-04 11:54:11

标签: python tar

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

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

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

2 个答案:

答案 0 :(得分:14)

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

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文件的根目录)。

答案 1 :(得分:6)

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