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
。