Можна або використовувати response.raw
об’єкт файлу , або повторити відповідь.
Використання response.raw
файлоподібного об'єкта за замовчуванням не декодує стислі відповіді (за допомогою GZIP або дефляції). Ви можете змусити його декомпресувати для вас будь-який спосіб, встановивши decode_content
атрибут в True
( requests
встановлює його False
для управління самим декодуванням). Потім ви можете використовувати, shutil.copyfileobj()
щоб Python передав дані до файлового об’єкта:
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)
Щоб повторити відповідь, використовуйте цикл; такий ітерація забезпечує декомпресію даних на цьому етапі:
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)
Це буде читати дані в 128 байтових фрагментах; якщо вам здається, що інший розмір шматка працює краще, скористайтеся Response.iter_content()
методом із спеціальним розміром шматка:
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)
Зауважте, що вам потрібно відкрити цільовий файл у двійковому режимі, щоб переконатися, що python не намагається перекласти нові рядки для вас. Ми також встановлюємо stream=True
так, щоб requests
спочатку не завантажувати все зображення в пам'ять.