2009-08-21 1 views
14

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

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

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

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

ответ

30

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") 
6

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

-1

После того как вы zipfile объекта от ответа @John Милликина в выше, вы можете распечатать содержимое файлов, содержащихся в почтовый индекс, как это:

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'] 

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

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

Смежные вопросы