1. ホーム
  2. python

[解決済み] Pythonで大きなファイルをリクエストでダウンロードする

2022-03-20 16:58:33

質問

リクエスト は本当に素晴らしいライブラリです。大きなファイル(>1GB)をダウンロードするのに使いたいと思っています。 問題は、ファイル全体をメモリに保持することができないので、チャンク単位で読み込む必要があることです。そして、これは以下のコードで問題になっています。

import requests

def DownloadFile(url)
    local_filename = url.split('/')[-1]
    r = requests.get(url)
    f = open(local_filename, 'wb')
    for chunk in r.iter_content(chunk_size=512 * 1024): 
        if chunk: # filter out keep-alive new chunks
            f.write(chunk)
    f.close()
    return 

なぜかこのように動作しません。ファイルに保存する前に、まだレスポンスをメモリに読み込んでいます。

アップデイト

FTPから大きなファイルをダウンロードできる小さなクライアント(Python 2.x /3.x)が必要な場合は、以下のものをご利用ください。 こちら . マルチスレッドと再接続をサポートし(接続を監視します)、ダウンロードタスクのためにソケットパラメータを調整します。

解決するには?

以下のストリーミングコードを使用すると、ダウンロードしたファイルのサイズに関係なく、Pythonのメモリ使用量を制限することができます。

def download_file(url):
    local_filename = url.split('/')[-1]
    # NOTE the stream=True parameter below
    with requests.get(url, stream=True) as r:
        r.raise_for_status()
        with open(local_filename, 'wb') as f:
            for chunk in r.iter_content(chunk_size=8192): 
                # If you have chunk encoded response uncomment if
                # and set chunk_size parameter to None.
                #if chunk: 
                f.write(chunk)
    return local_filename

を使用して返されるバイト数に注意してください。 iter_content は、正確には chunk_size それは、しばしばはるかに大きな乱数であり、繰り返しごとに異なることが予想されます。

参照 ボディコンテンツワークフロー レスポンス.iter_content を参照してください。