Vous pouvez soit utiliser le response.raw
Objet du fichier ou d'itérer sur la réponse.
Pour utiliser le response.raw
ne décodera pas, par défaut, les réponses compressées (avec GZIP ou deflate). Vous pouvez le forcer à décompresser pour vous en définissant l'option decode_content
de l'attribut True
( requests
le fixe à False
pour contrôler le décodage lui-même). Vous pouvez alors utiliser shutil.copyfileobj()
pour que Python transmette les données à 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 itérer sur la réponse, utilisez une boucle ; en itérant ainsi, vous vous assurez que les données sont décompressées à ce stade :
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)
Les données seront lues par morceaux de 128 octets ; si vous pensez qu'une autre taille de morceaux est plus appropriée, utilisez la commande Response.iter_content()
méthode avec une taille de morceau 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 défini stream=True
de sorte que requests
ne télécharge pas d'abord l'image entière en mémoire.
18 votes
Pour utiliser r.raw, vous devez définir stream=True
0 votes
Cela répond-il à votre question ? Télécharger un gros fichier en python avec des requêtes