У меня есть файл tar, в котором есть количество файлов. Мне нужно написать python script, который будет считывать содержимое файлов и выводит количество общих символов, включая общее количество букв, пробелов, символов новой строки, все, без разграничения файла tar.
Чтение содержимого tar файла без его разворачивания, в python script
Ответ 1
вы можете использовать getmembers()
>>> import tarfile
>>> tar = tarfile.open("test.tar")
>>> tar.getmembers()
После этого вы можете использовать extractfile() для извлечения элементов в качестве файлового объекта. Только пример
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()
В файле файле "f" в приведенном выше примере вы можете использовать read(), readlines() и т.д.
Ответ 2
вам нужно использовать модуль tarfile. В частности, вы используете экземпляр класса TarFile для доступа к файлу, а затем получаете доступ к именам с помощью 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().
Если вместо этого вы хотите прочитать содержимое, то вы используете этот метод
| 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 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()
Ответ 3
Реализация методов, упомянутых @stefano-borini Получите доступ к члену архива tar через имя файла, например:
#python3
myFile = myArchive.extractfile(
dict(zip(
myArchive.getnames(),
myArchive.getmembers()
))['path/to/file']
).read()`
Credits:
-
dict(zip(
из fooobar.com/info/13279/... -
tarfile.getnames
из fooobar.com/info/118219/... - Кроме того, для моих целей чтение tar-архива из буфера Как построить объект TarFile в памяти из байтового буфера в Python 3?