Lesen TAR-Datei Inhalte ohne entpacken es, in Python-Skript
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.
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:
-
dict(zip(
von https://stackoverflow.com/a/209854/1695680 -
tarfile.getnames
von https://stackoverflow.com/a/2018523/1695680 - Zusätzlich wird für meine Anwendungen, ein tar-Archiv aus dem Puffer Lese Wie Tardatei Objekt im Speicher von Bytepuffer in Python 3 zu konstruieren?