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 requests
puedes 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.