2009-08-21 9 views
14

Pisałem trochę kodu Pythona, który pobiera plik zip z internetu i na ciąg znaków:Jeśli mam zawartość pliku zip w ciągu znaków w języku Python, czy mogę ją rozpakować bez zapisywania w pliku?

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

widzę istnieje zipfile biblioteka, ale mam problem ze znalezieniem funkcji w nim, że mogę wystarczy przekazać masę surowych danych zip. Wydaje się, że chce go odczytać z pliku.

Czy naprawdę muszę zrzucić to do pliku tymczasowego, czy jest jakiś sposób obejścia tego?

Odpowiedz

30

zipfile.ZipFile akceptuje dowolny obiekt plikopodobny, dzięki czemu można używać StringIO (2.x) lub 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

Zawiń łańcuch w obiekcie cStringIO. Wygląda, działa i szarpie jak obiekt pliku, ale znajduje się w pamięci.

-1

Gdy masz zipfile obiekt z odpowiedzią @John Millikin za wyżej, można wydrukować zawartość plików zawartych w zip tak:

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

Dostaniesz coś takiego:

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

Użyłem tego w teście jednostki do potwierdzenia zawartości pliku zip.

Również, StringIO dał mi błąd: initial_value must be unicode or None, not str, więc zamiast tego użyłem BytesIO.

Powiązane problemy