2009-08-21 16 views
14

ho scritto un po 'di codice Python che recupera un file zip dal web e in una stringa:Se ho il contenuto di un file zip in una stringa Python, posso decomprimerlo senza scriverlo su un file?

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

vedo che c'è una biblioteca file zip, ma sto avendo problemi a trovare una funzione in modo che posso basta passare un mucchio di dati zip grezzi. Sembra voler leggerlo da un file.

Ho davvero bisogno di scaricare questo in un file temporaneo, o c'è un modo per aggirarlo?

risposta

30

zipfile.ZipFile accetta qualsiasi oggetto simile a file, in modo da poter utilizzare StringIO (2.x) o 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

Avvolgere la stringa in un oggetto cStringIO. Sembra, agisce e fa quack come un oggetto file, ma risiede nella memoria.

-1

Una volta ottenuto l'oggetto zipfile dalla risposta di @ John Millikin sopra, è possibile stampare il contenuto dei file contenuti nello zip in questo modo:

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

Otterrete qualcosa di simile:

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

L'ho usato in un test di unità per affermare il contenuto del file zip.

Inoltre, StringIO mi ha dato l'errore: initial_value must be unicode or None, not str, quindi ho usato invece BytesIO.

Problemi correlati