Вы можете использовать response.raw
объект файла или выполнить итерацию ответа.
Использование response.raw
файлового объекта по умолчанию не будет декодировать сжатые ответы (с помощью GZIP или deflate). В любом случае вы можете принудительно распаковать его, установив для 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
сначала не загружать все изображение в память.