Sie können entweder die Verwendung response.rawDateiobjekt oder Iterierte über die Antwort.
Wenn Sie das response.rawdateiä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_contentAttribut auf setzen True( requestssetzt 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 requestsnicht zuerst das gesamte Bild in den Speicher heruntergeladen wird.