2010-01-07 2 views
46

У меня есть tar-файл, в котором есть количество файлов. Мне нужно написать скрипт python, который будет считывать содержимое файлов и выдает количество общих символов, включая общее количество букв, пробелов, символов новой строки, все, без разграничения файла tar.чтение содержимого файла tar без его разворачивания, в скрипте python

+0

Как можно подсчитать знаки/буквы/пробел/Everthing без извлечения тех, где-то еще? – YOU

+5

вот как раз вопрос. –

ответ

83

вы можете использовать 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» в приведенном выше примере, вы можете использовать функцию чтения(), readlines() и т.д.

+9

" для члена в tar.getmembers() "может быть изменен на" для члена в tar ", который является генератором или итератором (я не уверен, какой). Но он получает член по одному. – huggie

+1

У меня была аналогичная проблема, но модуль tarfile, похоже, съел мой баран, хотя я использовал опцию ''r |''. – devsnd

+1

Ах. Я решил это. Предполагая, что вы напишете код, как намекнул huggie, вы должны «очищать» список членов время от времени. Поэтому, учитывая приведенный выше пример кода, это будет 'tar.members = []'. Дополнительная информация здесь: http://bit.ly/JKXrg6 – devsnd

9

необходимо использовать модуль 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() 
+0

Обратите внимание, что вы можете получить доступ к элементу через индекс, построенный так: 'myFile = myArchive.extractfile (dict (zip (myArchive.getnames(), myArchive.getmembers())) ['path/to/file']). read() ' – ThorSummoner

3

реализация методов, упомянутых @ Stefano-Борини Доступ к члену битуминозных архивы через имя файла, как так

#python3 
myFile = myArchive.extractfile( 
    dict(zip(
     myArchive.getnames(), 
     myArchive.getmembers() 
    ))['path/to/file'] 
).read()` 

Кредиты: