2010-11-14 25 views
0

Je voudrais vérifier l'existence d'un fichier donné dans une archive tar avec Python avant de l'obtenir comme un objet de type fichier. Je l'ai essayé avec isreg(), mais probablement je fais quelque chose de mal.Comment puis-je vérifier si un fichier existe dans une archive tar avec Python?

Comment puis-je vérifier si un fichier existe dans une archive tar avec Python?

J'ai essayé

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() 

probablement tai est faux. En fait tai.size() est toujours 0.

Répondre

0

Peut-être utiliser getnames()?

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

Si vous avez vraiment besoin de vérifier, vous pouvez tester l'adhésion en utilisant la méthode getnames et l'opérateur in:

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

Cependant, je pense qu'en Python (et le traitement des systèmes de fichiers général), les exceptions de capture sont préférées. Il est préférable d'essayer de lire et d'intercepter une exception, car il peut toujours se produire entre la vérification de l'existence d'un fichier et sa lecture ultérieure.

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

Vous pouvez utiliser tar.getnames() et l'opérateur in pour le faire:

$ 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

Cela correspond même si le fichier tar a le nom de fichier dans un sous-répertoire, et utilise normcase pour imiter le traitement des cas de nom de fichier le système d'exploitation actuel (par exemple sur Windows, la recherche de "readme.txt" doit correspondre à "README.TXT" dans le fichier 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())