Извлечение файлов из tar-файла в потоковом режиме - PullRequest
0 голосов
/ 04 апреля 2019

У меня есть поток, который содержит содержимое .tar, поэтому я работаю с ним, используя tarfile.open ('r |'). Что мне нужно сделать, - это просмотреть список файлов внутри него и прочитать некоторые из них.затем загрузите весь tar в другое место.

Когда я пытаюсь выполнить tarfile.extractfile () после tarfile.getnames (), он вызывает tarfile.StreamError.Но я не могу извлечь файл, имя которого я не знаю.

Как получить список файлов без разрушения tarfile?Я не могу сохранить весь tar в RAM \ disk, потому что некоторые файлы внутри него могут быть больше 10 ГБ.

>>> tf = tarfile.open(fileobj=open('Downloads/clean-alpine.ova', 'rb'), mode='r|')
>>> tfn = tf.getnames()
>>> tfn
['clean-alpine.ovf', 'clean-alpine.mf', 'clean-alpine-disk1.vmdk']
>>> tf.fileobj
<tarfile._Stream object at 0x7ff878dac7b8>
>>> tf.fileobj.pos
33595392
>>> ovf = tf.extractfile('clean-alpine.ovf')
>>> ovf
<ExFileObject name=''>
>>> d = ovf.read().decode()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python3.6/tarfile.py", line 696, in read
    self.fileobj.seek(offset + (self.position - start))
  File "/usr/lib/python3.6/tarfile.py", line 522, in seek
    raise StreamError("seeking backwards is not allowed")
tarfile.StreamError: seeking backwards is not allowed

1 Ответ

0 голосов
/ 25 июля 2019

Глядя на источник TarFile.extractall(), важно использовать TarFile в качестве итерируемого, как я делал в моем случае использования:

for member in tf:
    if not member.isfile():
        continue
    dest = Path.cwd() / member.name  # This is vulnerable to, like, 5 things
    with tf.extractfile(member) as tfobj:
        dest.write_bytes(tfobj.read())
...