Sie können entweder die Verwendung response.raw
Dateiobjekt oder Iterierte über die Antwort.
Wenn Sie das response.raw
dateiähnliche Objekt verwenden, werden komprimierte Antworten standardmäßig nicht dekodiert (mit GZIP oder Deflate). Sie können die Dekomprimierung ohnehin für Sie erzwingen, indem Sie das decode_content
Attribut auf setzen True
( requests
setzt es auf False
, um die Dekodierung selbst zu steuern). Anschließend können Sie shutil.copyfileobj()
Python die Daten in ein Dateiobjekt streamen lassen:
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)
Verwenden Sie eine Schleife, um die Antwort zu durchlaufen. Wenn Sie so iterieren, wird sichergestellt, dass die Daten in dieser Phase dekomprimiert werden:
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)
Dadurch werden die Daten in 128-Byte-Blöcken gelesen. Wenn Sie der Meinung sind, dass eine andere Blockgröße besser funktioniert, verwenden Sie die Response.iter_content()
Methode mit einer benutzerdefinierten Blockgröß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)
Beachten Sie, dass Sie die Zieldatei im Binärmodus öffnen müssen, um sicherzustellen, dass Python nicht versucht, Zeilenumbrüche für Sie zu übersetzen. Wir haben auch festgelegt stream=True
, dass requests
nicht zuerst das gesamte Bild in den Speicher heruntergeladen wird.