Saki0506
@Saki0506 (さき おぐら)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

pythonのrequestsモジュールを理解したいです

Q&A

Closed

解決したいこと

pythonのrequestsモジュールを使用しているのですが、サンプルコードがいまいち理解できないので詳しい方に教えていただきたいです。

サンプルコード

>>> import requests
>>> res = requests.get("https://automatetheboringstuff.com/files/rj.txt")
>>> res.raise_for_status()
>>> play_file = open("RomeoAndJuliet.txt", "wb")
>>> for chunk in res.iter_content(100000):
    play_file.write(chunk)
100000
78978
>>> play_file.close()

IDLEで書いております。
なぜfor文で100KBごとのチャンク(塊)をfor文でループさせて.writeで書き込みしているのでしょうか?requestsモジュールに詳しくないので詳しい書き方がわからないのですが、単純にrj.txtの内容を変数に入れて.writeで書いて.closeすれば良いのでは?と思ったのでループの意味がわかりません。一度の書き込みは100KBごとなどの制約でもあるのでしょうか?
サンプルの結果ですと最初の書き込みが100KBで次に余った78KB余りの書き込みを合計2回しているようです。

色々、記事などを調べてみたのですがわからなかったので質問させていただきました。

よろしくお願いします。

0

1Answer

単純にrj.txtの内容を変数に入れて.writeで書いて.closeすれば良いのでは

rj.txt のファイルサイズが大きくなければそれで十分ですが、ファイルサイズが数GBに達すると、変数に入れるためのメモリを確保できずエラーになることがあります。サンプルコードのようにチャンクに分けて読み書きするのはそれを回避するための手法です。 requests に限らず、データが大きくなる可能性のある入出力では普通に行われます。

チャンクサイズはシステムに合わせたほどよい数字にします。数バイトなどあまりに小さくするとオーバーヘッド(書き込み先ファイルのロックと解放の回数など)が増えますし、大きくしすぎるとメモリ使用量が増えます。 100KB はちょうどよさそうです。ただ、必ず 100KB にする必要はありません。

1Like

Comments

  1. @Saki0506

    Questioner

    お久しぶりです。いつもわかりやすい回答ありがとうございます。
    おかげで理解できスッキリしました!ありがとうございました。

Your answer might help someone💌