Vous pouvez soit utiliser l' response.raw
objet fichier , soit parcourir la réponse.
Utiliser l' response.raw
objet de type fichier ne décode pas, par défaut, les réponses compressées (avec GZIP ou dégonfler). Vous pouvez quand même le forcer à décompresser pour vous en définissant l' decode_content
attribut sur True
(le requests
définit sur False
pour contrôler le décodage lui-même). Vous pouvez ensuite utiliser shutil.copyfileobj()
pour que Python diffuse les données vers un objet fichier:
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)
Pour parcourir la réponse, utilisez une boucle; itérer comme ceci garantit que les données sont décompressées à cette étape:
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)
Cela lira les données en blocs de 128 octets; si vous pensez qu'une autre taille de bloc fonctionne mieux, utilisez la Response.iter_content()
méthode avec une taille de bloc personnalisée:
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)
Notez que vous devez ouvrir le fichier de destination en mode binaire pour vous assurer que python n'essaie pas de traduire les nouvelles lignes pour vous. Nous avons également configuré stream=True
ce qui requests
ne télécharge pas l'image entière en mémoire en premier.