Mam plik tar, który zawiera wiele plików. Muszę napisać skrypt w Pythonie, który odczyta zawartość plików i poda liczbę wszystkich znaków, w tym całkowitą liczbę liter, spacji, znaków nowej linii, wszystko, bez rozpakowywania pliku tar.
82
Odpowiedzi:
możesz użyć
getmembers()
>>> import tarfile >>> tar = tarfile.open("test.tar") >>> tar.getmembers()
Następnie możesz użyć
extractfile()
do wyodrębnienia podzbiorów jako obiektu pliku. Tylko przykładimport 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()
Z obiektu pliku
f
w powyższym przykładzie, można użyćread()
,readlines()
etc.źródło
'r|'
opcji.tar.members = []
. Więcej informacji tutaj: bit.ly/JKXrg6tar.getmembers()
wywołany wiele razy, gdy zostanie umieszczony wfor member in tar.getmembers()
pętli?musisz użyć modułu tarfile. W szczególności używasz wystąpienia klasy TarFile, aby uzyskać dostęp do pliku, a następnie uzyskać dostęp do nazw za pomocą 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().
Jeśli zamiast tego chcesz przeczytać treść , użyj tej metody
| 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()
źródło
myFile = myArchive.extractfile( dict(zip(myArchive.getnames(), myArchive.getmembers()))['path/to/file'] ).read()
Implementacja metod wymienionych przez @ stefano-borini Dostęp do członka archiwum tar poprzez nazwę pliku w ten sposób
#python3 myFile = myArchive.extractfile( dict(zip( myArchive.getnames(), myArchive.getmembers() ))['path/to/file'] ).read()`
Kredyty:
dict(zip(
z https://stackoverflow.com/a/209854/1695680tarfile.getnames
z https://stackoverflow.com/a/2018523/1695680źródło
możesz użyć tarfile.list () ex:
filename = "abc.tar.bz2" with open( filename , mode='r:bz2') as f1: print(f1.list())
po otrzymaniu tych danych. możesz manipulować tym wyjściem lub zapisywać je do pliku i robić wszystko, czego potrzebujesz.
źródło