2010-01-07 5 views
46

J'ai un fichier tar qui contient un certain nombre de fichiers. J'ai besoin d'écrire un script python qui va lire le contenu des fichiers et donne le nombre total de caractères, y compris le nombre total de lettres, d'espaces, de caractères de nouvelle ligne, tout, sans décompresser le fichier tar.lecture du contenu du fichier tar sans le débloquer, en script python

+0

Comment pouvez-vous compter les caractères/lettres/espaces/everthing sans extraire ceux à un autre endroit? – YOU

+5

c'est précisément la question posée. –

Répondre

83

vous pouvez utiliser GetMembers()

>>> import tarfile 
>>> tar = tarfile.open("test.tar") 
>>> tar.getmembers() 

Après cela, vous pouvez utiliser extractfile() pour extraire les membres comme objet de fichier. Juste un exemple

import tarfile,os 
import sys 
os.chdir("/tmp/foo") 
tar = tarfile.open("test.tar") 
for member in tar.getmembers(): 
    f=tar.extractfile(member) 
    content=f.read() 
    print "%s has %d newlines" %(member, content.count("\n")) 
    print "%s has %d spaces" % (member,content.count(" ")) 
    print "%s has %d characters" % (member, len(content)) 
    sys.exit() 
tar.close() 

Avec l'objet fichier "f" dans l'exemple ci-dessus, vous pouvez utiliser read(), readlines(), etc.

+9

" pour un membre dans tar.getmembers() "peut être changé en" pour membre dans tar "qui est soit un générateur ou un itérateur (je ne sais pas lequel). Mais il obtient un membre à la fois. – huggie

+1

J'ai juste eu un problème similaire, mais le module tarfile semble manger mon bélier, même si j'ai utilisé l'option '' r | ''. – devsnd

+1

Ah. Je l'ai résolu. En supposant que vous écrivez le code comme suggéré par huggie, vous devez "nettoyer" la liste des membres de temps en temps. Donc, étant donné l'exemple de code ci-dessus, ce serait tar.members = [] '. Plus d'infos ici: http://bit.ly/JKXrg6 – devsnd

9

vous devez utiliser le module tarfile. Plus précisément, vous utilisez une instance de la classe tarfile pour accéder au fichier, puis accéder aux noms avec TarFile.getnames()

| getnames(self) 
|  Return the members of the archive as a list of their names. It has 
|  the same order as the list returned by getmembers(). 

Si au contraire vous voulez lire le contenu , vous utilisez cette méthode

| extractfile(self, member) 
|  Extract a member from the archive as a file object. `member' may be 
|  a filename or a TarInfo object. If `member' is a regular file, a 
|  file-like object is returned. If `member' is a link, a file-like 
|  object is constructed from the link's target. If `member' is none of 
|  the above, None is returned. 
|  The file-like object is read-only and provides the following 
|  methods: read(), readline(), readlines(), seek() and tell() 
+0

Notez, vous pouvez alors accéder au membre via un index construit comme si 'myFile = myArchive.extractfile (dict (zip (monArchive.getnames(), monArchive.getmembers())) ['chemin/vers/fichier']). read() ' – ThorSummoner

3

Une mise en œuvre des méthodes mentionnées par @ stefano-Borini Accédez à une archive tar membre via le nom de fichier comme tant

#python3 
myFile = myArchive.extractfile( 
    dict(zip(
     myArchive.getnames(), 
     myArchive.getmembers() 
    ))['path/to/file'] 
).read()` 

Crédits: