2010-11-14 4 views
0

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

Как проверить, существует ли файл в архиве 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.

ответ

0

Возможно использование getnames()?

tar = tarfile.open('sample.tar','r') 
if 'test3.py' in tar.getnames(): 
    print 'test3.py is in sample.tar' 
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 
... 
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 
0

Это соответствует даже если архивный файл имеет имя файла в подкаталоге, и использует 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()) 

 Смежные вопросы

  • Нет связанных вопросов^_^