Come faccio a leggere i file selezionati da una remota archivio Zip su HTTP, utilizzando Python?
Domanda
Ho bisogno di leggere i file selezionati, corrispondente al nome del file da remoto archivio zip usando Python.Io non voglio salvare il full zip in un file temporaneo (non è così grande, così posso gestire tutto in memoria).
Ho già scritto il codice e funziona, e sto rispondendo a me, così posso cercare più tardi.Ma dal momento che l'evidenza suggerisce che io sono uno dei più scemo partecipanti su Stackoverflow, sono sicuro che c'è spazio per il miglioramento.
Soluzione
Ecco come l'ho fatto (prendendo tutti i file che terminano in ".i ranghi"):
import urllib2, cStringIO, zipfile
try:
remotezip = urllib2.urlopen(url)
zipinmemory = cStringIO.StringIO(remotezip.read())
zip = zipfile.ZipFile(zipinmemory)
for fn in zip.namelist():
if fn.endswith(".ranks"):
ranks_data = zip.read(fn)
for line in ranks_data.split("\n"):
# do something with each line
except urllib2.HTTPError:
# handle exception
Altri suggerimenti
Grazie Marcel per la tua domanda e risposta (ho avuto lo stesso problema in un contesto diverso e incontrato la stessa difficoltà con i file di oggetti di non essere realmente file-come)!Proprio come un aggiornamento:Per Python 3.0, il codice deve essere leggermente modificata:
import urllib.request, io, zipfile
try:
remotezip = urllib.request.urlopen(url)
zipinmemory = io.BytesIO(remotezip.read())
zip = zipfile.ZipFile(zipinmemory)
for fn in zip.namelist():
if fn.endswith(".ranks"):
ranks_data = zip.read(fn)
for line in ranks_data.split("\n"):
# do something with each line
except urllib.request.HTTPError:
# handle exception
Questo farà il lavoro senza scaricare l'intero file zip!
Tenete a mente che solo la decompressione di un file ZIP può comportare una vulnerabilità di sicurezza.