Если у меня есть содержимое zipfile в строке Python, могу ли я его распаковать без записи в файл?
Я написал код Python, который извлекает zip файл из Интернета и в строку:
In [1]: zip_contents[0:5]
Out[1]: 'PK\x03\x04\x14'
Я вижу там библиотеку zipfile, но мне трудно найти в ней функцию, чтобы я мог просто передать кучу необработанных данных zip. Кажется, он хочет прочитать его из файла.
Нужно ли мне сбрасывать это на временный файл, или есть способ обойти его?
Ответы
Ответ 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
.