Puede usar el response.raw
objeto de archivo o iterar sobre la respuesta.
El uso del response.raw
objeto tipo archivo no descodificará, de forma predeterminada, las respuestas comprimidas (con GZIP o desinflado). De todos modos, puede forzarlo a descomprimirse configurando el decode_content
atributo en True
(lo requests
configura False
para controlar la decodificación). Luego puede usar shutil.copyfileobj()
para que Python transmita los datos a un objeto de archivo:
import requests
import shutil
r = requests.get(settings.STATICMAP_URL.format(**data), stream=True)
if r.status_code == 200:
with open(path, 'wb') as f:
r.raw.decode_content = True
shutil.copyfileobj(r.raw, f)
Para iterar sobre la respuesta, use un bucle; iterar así asegura que los datos se descompriman en esta etapa:
r = requests.get(settings.STATICMAP_URL.format(**data), stream=True)
if r.status_code == 200:
with open(path, 'wb') as f:
for chunk in r:
f.write(chunk)
Esto leerá los datos en fragmentos de 128 bytes; Si cree que otro tamaño de fragmento funciona mejor, utilice el Response.iter_content()
método con un tamaño de fragmento personalizado:
r = requests.get(settings.STATICMAP_URL.format(**data), stream=True)
if r.status_code == 200:
with open(path, 'wb') as f:
for chunk in r.iter_content(1024):
f.write(chunk)
Tenga en cuenta que debe abrir el archivo de destino en modo binario para asegurarse de que Python no intente traducir nuevas líneas por usted. También lo configuramos stream=True
para que requests
no descargue la imagen completa en la memoria primero.