читання вмісту файлу tar, не знімаючи його з коду, сценарієм python


82

У мене є файл tar, в якому є кількість файлів. Мені потрібно написати сценарій python, який буде читати вміст файлів і даватиме загальну кількість символів, включаючи загальну кількість букв, пробіли, символи нового рядка, все, не знімаючи з коду файл tar.


Як можна порахувати символи / літери / пробіли / щось, не виймаючи їх кудись ще?
ВИ

16
ось саме це питання.
Ерік Каплун

Відповіді:


127

ви можете використовувати 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()т.д.


17
"for member in tar.getmembers ()" можна змінити на "for member in tar", який є або генератором, або ітератором (я не впевнений, який). Але він отримує учасника по черзі.
huggie

2
Я просто мав подібну проблему, але модуль tarfile, здається, з'їдає мою оперативну пам'ять, хоча я використовував цю 'r|'опцію.
devsnd

2
Ага. Я це вирішив. Якщо припустити, що ви пишете код так, як натякає huggie, вам доведеться час від часу "чистити" список учасників. Отже, враховуючи приклад коду вище, це буде tar.members = []. Більше інформації тут: bit.ly/JKXrg6
devsnd

буде tar.getmembers()викликатися кілька разів, коли помістити його в for member in tar.getmembers()цикл?
Haifeng Zhang

1
Після того, як ви зробите "f = tar.extractfile (member)", вам також потрібно закрити f?
bolei

12

вам потрібно використовувати модуль 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()
ThorSummoner

5

Реалізація методів, згаданих @ stefano-borini Отримайте доступ до члена архіву tar за допомогою імені файлу

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

Кредити:


0

Ви можете використовувати tarfile.list () ex:

filename = "abc.tar.bz2"
with open( filename , mode='r:bz2') as f1:
    print(f1.list())

після отримання цих даних. Ви можете маніпулювати або писати цей висновок у файл і робити все, що потрібно.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.