Подтвердить что ты не робот

Если у меня есть содержимое zipfile в строке Python, могу ли я его распаковать без записи в файл?

Я написал код Python, который извлекает zip файл из Интернета и в строку:

In [1]: zip_contents[0:5]
Out[1]: 'PK\x03\x04\x14'

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

Нужно ли мне сбрасывать это на временный файл, или есть способ обойти его?

4b9b3361

Ответ 1

zipfile.ZipFile принимает любой файл-подобный объект, поэтому вы можете использовать StringIO (2.x) или BytesIO (3.x):

try:
  from cStringIO import StringIO
except:
  from StringIO import StringIO
import zipfile

fp = StringIO('PK\x03\x04\x14')
zfp = zipfile.ZipFile(fp, "r")

Ответ 2

Оберните свою строку в объект cStringIO. Он выглядит, действует и крякает, как файловый объект, но находится в памяти.

Ответ 3

Как только у вас есть объект zipfile из ответа @John Millikin выше, вы можете распечатать содержимое файлов, содержащихся в zip, следующим образом:

file_objects = zfp.infolist()
contents = [zfp.read(file_object) for file_object in file_objects]
print(contents)

Вы получите что-то вроде этого:

['Content for file 1', 'Content for file 2']

Я использовал это в unit test для утверждения содержимого zip файла.

Кроме того, StringIO дал мне ошибку: initial_value must be unicode or None, not str, поэтому я использовал BytesIO.