2010-01-07 12 views
46

Ich habe eine TAR-Datei, die Anzahl der Dateien enthält. Ich muss ein Python-Skript schreiben, das den Inhalt der Dateien liest und die Gesamtzahl der Zeichen angibt, einschließlich der Gesamtzahl der Buchstaben, Leerzeichen, Zeilenumbrüche, alles, ohne die TAR-Datei zu entpacken.TAR-Datei Inhalt lesen, ohne entpacken, in Python-Skript

+0

Wie können Sie die Zeichen/Buchstaben/Leerzeichen/Everthing zählen, ohne diejenigen, woanders zu extrahieren? – YOU

+5

das ist genau die Frage gestellt. –

Antwort

83

Sie können GetMembers verwenden()

>>> 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.

+9

" für Mitglied in tar.getmembers() "kann zu" für Mitglied in tar "geändert werden, das entweder ein Generator oder ein Iterator ist (ich bin mir nicht sicher welche). Aber es bekommt ein Mitglied nach dem anderen. – huggie

+1

Ich hatte gerade ein ähnliches Problem, aber das Tarfile-Modul scheint meinen RAM zu essen, obwohl ich die "r |" -Option verwendet habe. – devsnd

+1

Ah. Ich habe es gelöst. Vorausgesetzt, Sie würden den Code schreiben, wie von Huggie angedeutet, müssen Sie die Liste der Mitglieder hin und wieder "säubern". In dem obigen Codebeispiel wäre das also "tar.members = []". Mehr Infos hier: http://bit.ly/JKXrg6 – devsnd

9

Sie müssen das Tarfile-Modul verwenden. Insbesondere Sie eine Instanz der Klasse tarfile verwenden, um die Datei zuzugreifen, und dann Zugriff auf die Namen 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 den Inhalt lesen möchten, 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() 
+0

Hinweis: Sie können dann auf den Member über einen Index zugreifen, der wie folgt aufgebaut ist: 'myFile = myArchive.extractfile (dict (zip (myArchive.getnames(), myArchive.getmembers())) [' Pfad/zu/Datei ']). read() ' – ThorSummoner

3

Eine Implementierung der von @ stefano-Borini genannten Verfahren 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: