使用python中的tarfile lib从tar文件获取单个文件

时间:2016-12-16 22:02:07

标签: python tarfile

我正在尝试从tar存档中获取单个文件。我有tarfile库,我可以做一些事情,比如在具有正确扩展名的列表中查找文件:

喜欢他们的例子:

def xml_member_files(self,members): 
    for tarinfo in members:
        if os.path.splitext(tarinfo.name)[1] == ".xml":
            yield tarinfo


    member_file = self.xml_member_files(tar)
    for m in member_file:           
        print m.name

这很好,输出是:

RS2_C0RS2_OK67683_PK618800_DK549742_SLA23_20151006_234046_HH_SLC/lutBeta.xml
RS2_C0RS2_OK67683_PK618800_DK549742_SLA23_20151006_234046_HH_SLC/lutGamma.xml
RS2_C0RS2_OK67683_PK618800_DK549742_SLA23_20151006_234046_HH_SLC/lutSigma.xml
RS2_C0RS2_OK67683_PK618800_DK549742_SLA23_20151006_234046_HH_SLC/product.xml

如果我说只是寻找product.xml,那么它不起作用。所以我尝试了这个:

    ti = tar.getmember('product.xml')
    print ti.name

并且它找不到product.xml,因为我正在猜测路径信息。我不知道如何只检索那些路径信息,所以我可以在提取后得到我的product.xml文件(感觉就像我正在以艰难的方式做事)但是,我怎么弄清楚那条路径所以我可以连接它是我的其他文件函数,读取并加载该文件后,它是从tar文件中提取的唯一文件吗?

2 个答案:

答案 0 :(得分:2)

通过迭代getnames()的结果返回完整路径。例如,要获取lutBeta.xml的完整路径:

tar = tarfile.TarFile('mytarfile.tar')
membername = [x for x in tar.getnames() if os.path.basename(x) == 'lutBeta.xml'][0]

答案 1 :(得分:1)

我会首先尝试TarFile.getnames(),我想这与命令行中的tar tzf filename.tar.gz非常相似。然后你会找到提供给你的getmember()或getmembers()的路径。