如何使用Python检查tar档案中是否存在文件?

时间:2010-11-14 23:38:13

标签: python tar tarfile

我想在使用Python作为文件类对象之前验证tar存档中是否存在给定文件。我用isreg()尝试过,但可能我做错了。

如何使用Python检查tar档案中是否存在文件?

我试过

import tarfile


tar = tarfile.open("sample.tar", "w")
tar.add("test1.txt")
tar.add("test2.txt")
tar.add("test3.py")
tar.close()

tar = tarfile.open("sample.tar", "r")
tai = tar.tarinfo(name="test3.py")
print(tai.isreg())
print(tai.size())
tar.close()

可能 tai 错了。实际上tai.size()始终为0。

4 个答案:

答案 0 :(得分:3)

如果您确实需要检查,则可以使用getnames方法和in运算符测试会员资格:

>>> import tarfile
>>> tar = tarfile.open("sample.tar", "w")
>>> "sample.tar" in tar.getnames()
True

但是,我认为在Python(以及一般的文件系统处理)中,首选捕获异常。最好尝试读取并捕获异常,因为在检查文件存在和稍后读取文件之间总是会发生事情。

>>> try:
...     tar.getmember('contents.txt')
... except KeyError:
...     pass
...

答案 1 :(得分:0)

也许使用getnames()

tar = tarfile.open('sample.tar','r')
if 'test3.py' in tar.getnames():
    print 'test3.py is in sample.tar'

答案 2 :(得分:0)

您可以使用tar.getnames()in运算符来执行此操作:

$ touch a.txt
$ tar cvf a.tar a.txt
$ python
>>> names = tarfile.open('a.tar').getnames()
>>> 'a.txt' in names
True
>>> 'b.txt' in names
False

答案 3 :(得分:0)

即使tar文件在子目录中具有文件名,并且使用normcase来模拟当前操作系统的文件名处理(例如在Windows上,搜索“readme.txt”应该匹配“README.TXT”) tar文件)。

def filename_in_tar(filename, atarfile):
    filename= os.path.normcase(filename)
    return any(
        filename == os.path.normcase(os.path.basename(tfn))
        for tfn in atarfile.getnames())