web-dev-qa-db-fra.com

lire le contenu du fichier tar sans le décompresser, dans le script python

J'ai un fichier tar qui contient un certain nombre de fichiers. J'ai besoin d'écrire un script python qui lira le contenu des fichiers et donnera le nombre de caractères totaux, y compris le nombre total de lettres, d'espaces, de caractères de nouvelle ligne, tout, sans dégager le fichier tar .

69
randeepsp

vous pouvez utiliser getmembers ()

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

Après cela, vous pouvez utiliser extractfile () pour extraire les membres en tant qu'objet 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.

108
ghostdog74

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édez 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 à la place vous voulez lire le content, alors 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()
11
Stefano Borini

Une implémentation des méthodes mentionnées par @ stefano-borini Accéder à un membre des archives tar via un nom de fichier comme ceci

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

Crédits:

4
ThorSummoner