У меня есть tar-файл, в котором есть несколько файлов. Мне нужно написать скрипт Python, который будет читать содержимое файлов и давать общее количество символов, включая общее количество букв, пробелов, символов новой строки и т. Д., Без распаковки tar-файла.
82
Ответы:
вы можете использовать
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()
т. Д.источник
'r|'
опцию.tar.members = []
. Подробнее здесь: bit.ly/JKXrg6tar.getmembers()
вызываться несколько раз при включенииfor member in tar.getmembers()
цикла?вам нужно использовать модуль 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'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()
Реализация методов, упомянутых @ stefano-borini Доступ к члену tar-архивов через имя файла, например
#python3 myFile = myArchive.extractfile( dict(zip( myArchive.getnames(), myArchive.getmembers() ))['path/to/file'] ).read()`
Кредиты:
dict(zip(
из https://stackoverflow.com/a/209854/1695680tarfile.getnames
из https://stackoverflow.com/a/2018523/1695680источник
вы можете использовать tarfile.list () например:
filename = "abc.tar.bz2" with open( filename , mode='r:bz2') as f1: print(f1.list())
после получения этих данных. вы можете манипулировать или записывать этот вывод в файл и делать все, что вам нужно.
источник