2

我想在将给定文件作为类文件对象获取之前,使用 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.size()总是0。

4

4 回答 4

6

如果你真的需要检查,那么你可以使用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
...
于 2010-11-14T23:53:09.427 回答
0

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

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())
于 2010-12-14T08:56:05.707 回答
0

也许使用getnames()

tar = tarfile.open('sample.tar','r')
if 'test3.py' in tar.getnames():
    print 'test3.py is in sample.tar'
于 2010-11-14T23:52:47.353 回答
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
于 2010-11-14T23:53:10.300 回答