Ich habe eine TAR-Datei, die die Anzahl der Dateien enthält. Ich muss ein Python-Skript schreiben, das den Inhalt der Dateien liest und die Anzahl der Gesamtzeichen angibt, einschließlich der Gesamtzahl der Buchstaben, Leerzeichen, Zeilenumbrüche usw., ohne die Teer-Datei zu entkernen.
81
Antworten:
Sie können verwenden
getmembers()
>>> import tarfile >>> tar = tarfile.open("test.tar") >>> tar.getmembers()
Danach können Sie
extractfile()
die Mitglieder als Dateiobjekt extrahieren. Nur ein Beispielimport 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 verwendenread()
,readlines()
usw.quelle
'r|'
Option verwendet habe.tar.members = []
. Weitere Infos hier: bit.ly/JKXrg6tar.getmembers()
mehrmals aufgerufen, wenn es in einefor member in tar.getmembers()
Schleife gestellt wird?Sie müssen das Tarfile-Modul verwenden. Insbesondere verwenden Sie eine Instanz der Klasse TarFile, um auf die Datei zuzugreifen, und greifen dann mit TarFile.getnames () auf die Namen zu.
| 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 den Inhalt lesen möchten , 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()
quelle
myFile = myArchive.extractfile( dict(zip(myArchive.getnames(), myArchive.getmembers()))['path/to/file'] ).read()
Eine Implementierung der von @ stefano-borini genannten Methoden Greifen Sie über einen solchen Dateinamen auf ein Mitglied des Tar-Archivs zu
#python3 myFile = myArchive.extractfile( dict(zip( myArchive.getnames(), myArchive.getmembers() ))['path/to/file'] ).read()`
Credits:
dict(zip(
von https://stackoverflow.com/a/209854/1695680tarfile.getnames
von https://stackoverflow.com/a/2018523/1695680quelle
Sie können tarfile.list () verwenden, z.
filename = "abc.tar.bz2" with open( filename , mode='r:bz2') as f1: print(f1.list())
nachdem Sie diese Daten erhalten haben. Sie können diese Ausgabe bearbeiten oder in eine Datei schreiben und alles tun, was Sie benötigen.
quelle