Frage

Ich habe eine TAR-Datei, die Anzahl der Dateien in sich hat. Ich brauche einen Python-Skript zu schreiben, die den Inhalt der Dateien lesen und gibt die Zählung o Gesamt Zeichen, einschließlich Gesamtzahl der Buchstaben, Leerzeichen, Zeilenumbrüche, alles, ohne die TAR-Datei zu entpacken.

War es hilfreich?

Lösung

Sie verwenden können GetMembers ()

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

Danach können Sie extractfile () verwenden, um die Mitglieder als Dateiobjekt zu extrahieren. Nur ein Beispiel

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

Mit dem Dateiobjekt "f" in dem obigen Beispiel, können Sie lesen (), readlines () usw.

Andere Tipps

Sie müssen das tarfile Modul verwenden. Insbesondere verwenden Sie eine Instanz der Klasse tarfile die Datei zuzugreifen, und dann den Namen Zugriff mit 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().

Wenn Sie stattdessen möchten Sie die Inhalt lesen , dann verwenden Sie diese Methode

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

Eine Implementierung der genannten Verfahren durch @ stefano-Borini Greifen Sie auf ein tar-Archive Mitglied über Dateinamen wie so

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

Credits:

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top