Используя Python, как вы распаковываете чисто в памяти?

Я работаю в среде, где я не могу ничего сохранить на диск. Мне нужно иметь возможность извлекать файлы tar и распаковывать их без сохранения на диск. Кажется, это не удается:

Я пробовал это, но он выдает ошибки:

# fetch.py
from cStringIO import StringIO
import requests
url = "http://example.com/data.tar.gz"
response = requests.get(url)

# ERROR is thrown here. Error shown below
tar = tarfile.open(mode= "r:gz", fileobj = StringIO(response.content))

# This SHOULD break as tar.extract() saves to disk. 
# Can't tell because of error on previous line of code.
data = tar.extract() 

Как описано в блоке кода выше, я получаю следующую трассировку в строке ошибки:

Traceback (most recent call last):
  File "<input>", line 1, in <module>
  File "./importers/bestbuy_fetcher.py", line 23, in download_bestbuy_batch
    tar = tarfile.open(mode= "r:gz", fileobj = StringIO(response.content))
  File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/tarfile.py", line 1662, in open
    return func(name, filemode, fileobj, **kwargs)
  File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/tarfile.py", line 1711, in gzopen
    **kwargs)
  File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/tarfile.py", line 1689, in taropen
    return cls(name, mode, fileobj, **kwargs)
  File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/tarfile.py", line 1568, in __init__
    self.firstmember = self.next()
  File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/tarfile.py", line 2324, in next
    raise ReadError(str(e))
ReadError: invalid header
25
задан Jeremy Banks 25 November 2012 в 07:29
поделиться

2 ответа

Оказалось, что проблема заключалась в том, что файл " data.tar.gz не был архивом tar. Просто сжатым файлом gzip. Поэтому я решил его с помощью:

# fetch.py
from cStringIO import StringIO
import gzip
import requests
# Called a 'tar' file but actually a gzip file. @#$%!!!
url = "http://example.com/data.tar.gz"
response = requests.get(url)

results = gzip.GzipFile(fileobj=StringIO(response.content))

Спасибо всем, кто помог принять участие!

11
ответ дан 25 September 2019 в 00:47
поделиться

Вы можете попробовать то, что мы сделали при работе с запросами + tar: Используйте | Режим, чтобы открыть файл. Для получения дополнительной информации см. http://docs.python.org/library/tarfile.html#tarfile.open .

Вы можете увидеть код на https://github.com/djeese/djeese-client/blob/master/djeese/commands/clonestatic.py#L53

В основном вы откройте файл tar, используя tarfile.open(mode='r|gz', fileobj=response.raw).

Это прекрасно сработало для нас, и, надеюсь, тоже для вас.

8
ответ дан 25 September 2019 в 00:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: