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.
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.
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ład
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()
Z obiektu pliku f
w powyższym przykładzie, można użyć read()
, readlines()
etc.
'r|'
opcji.
tar.members = []
. Więcej informacji tutaj: bit.ly/JKXrg6
tar.getmembers()
wywołany wiele razy, gdy zostanie umieszczony w for 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()
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/1695680moż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.