2008-09-18 14 views
9

Necesito leer los archivos seleccionados, haciendo coincidir el nombre del archivo, desde un archivo zip remoto usando Python. No quiero guardar el archivo zip completo en un archivo temporal (no es tan grande, así que puedo manejar todo en la memoria).¿Cómo leo archivos seleccionados de un archivo Zip remoto a través de HTTP usando Python?

Ya he escrito el código y funciona, y estoy respondiendo yo mismo para poder buscarlo más tarde. Pero dado que la evidencia sugiere que soy uno de los participantes más tontos en Stackoverflow, estoy seguro de que hay margen de mejora.

Respuesta

8

Así es como lo hice (agarrar todos los archivos que terminan en ".ranks"):

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 
+0

desea reemplazar la primera línea con: urllib2 importación, archivo zip. – Jim

+0

¿Por qué no usas 'ZipFile (urllib2.urlopen (url))'? – jfs

+0

Intenté eso, pero no pude hacerlo funcionar porque, aunque era un objeto similar a un archivo, no admitía una función particular que Zipfile necesitaba. Es por eso que lo amortigué con cStringIO. –

2

Gracias a Marcel por su pregunta y respuesta (tuve el mismo problema en un contexto diferente y encontré la misma dificultad con los objetos de tipo archivo que realmente no se parecen a archivos). Así como una actualización: Para Python 3.0, el código tiene que ser modificado ligeramente:

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 
Cuestiones relacionadas