Как я могу проверить, существует ли файл в архиве tar с Python? - PullRequest
0 голосов
/ 15 ноября 2010

Я хотел бы проверить существование данного файла в архиве tar с Python, прежде чем я получу его как файлоподобный объект. Я пробовал это с isreg(), но, вероятно, я что-то не так делаю.

Как я могу проверить, существует ли файл в архиве tar с Python?

Я пытался

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 ]

3 голосов
/ 15 ноября 2010

Если вам действительно нужно проверить, то вы можете проверить членство, используя метод 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
...
0 голосов
/ 14 декабря 2010

Это соответствует, даже если 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())
0 голосов
/ 15 ноября 2010

Вы можете использовать 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
0 голосов
/ 15 ноября 2010

Может быть, использовать getnames()?

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