Saltar al contenido

Descargar archivo Zip devuelto desde URL

Si te encuentras con algo que te causa duda puedes comentarlo y haremos todo lo posible de ayudarte lo más rápido posible.

Solución:

Por lo que puedo decir, la forma correcta de hacer esto es:

import requests, zipfile, StringIO
r = requests.get(zip_file_url, stream=True)
z = zipfile.ZipFile(StringIO.StringIO(r.content))
z.extractall()

por supuesto, querrá verificar que el GET fue exitoso con r.ok.

Para python 3+, sustituya el módulo StringIO por el módulo io y use BytesIO en lugar de StringIO: aquí hay notas de la versión que mencionan este cambio.

import requests, zipfile, io
r = requests.get(zip_file_url)
z = zipfile.ZipFile(io.BytesIO(r.content))
z.extractall("/path/to/destination_directory")

La mayoría de la gente recomienda usar requests si está disponible, y el requests la documentación recomienda esto para descargar y guardar datos sin procesar desde una URL:

import requests 

def download_url(url, save_path, chunk_size=128):
    r = requests.get(url, stream=True)
    with open(save_path, 'wb') as fd:
        for chunk in r.iter_content(chunk_size=chunk_size):
            fd.write(chunk)

Dado que la respuesta pregunta sobre la descarga y ahorro el archivo zip, no he entrado en detalles sobre la lectura del archivo zip. Vea una de las muchas respuestas a continuación para conocer las posibilidades.

Si por alguna razón no tiene acceso a requestspuedes usar urllib.request en cambio. Puede que no sea tan robusto como el anterior.

import urllib.request

def download_url(url, save_path):
    with urllib.request.urlopen(url) as dl_file:
        with open(save_path, 'wb') as out_file:
            out_file.write(dl_file.read())

Finalmente, si todavía está usando Python 2, puede usar urllib2.urlopen.

from contextlib import closing

def download_url(url, save_path):
    with closing(urllib2.urlopen(url)) as dl_file:
        with open(save_path, 'wb') as out_file:
            out_file.write(dl_file.read())

Con la ayuda de esta publicación de blog, lo tengo funcionando con solo requests. El punto de lo raro stream la cosa es que no necesitamos llamar content en solicitudes grandes, lo que requeriría que todo se procesara a la vez, obstruyendo la memoria. Él stream evita esto iterando a través de los datos un fragmento a la vez.

url = 'https://www2.census.gov/geo/tiger/GENZ2017/shp/cb_2017_02_tract_500k.zip'
target_path = 'alaska.zip'

response = requests.get(url, stream=True)
handle = open(target_path, "wb")
for chunk in response.iter_content(chunk_size=512):
    if chunk:  # filter out keep-alive new chunks
        handle.write(chunk)
handle.close()

Valoraciones y comentarios

Si guardas algún reparo o forma de regenerar nuestro sección te recordamos realizar una crítica y con placer lo interpretaremos.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *