[解決済み] 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 を参照してください。
関連
-
Pythonの非常に便利な2つのデコレーターを解説
-
任意波形を生成してtxtで保存するためのPython実装
-
[解決済み】NameError: 名前 'self' が定義されていません。
-
[解決済み] Pythonには文字列の'contains'サブストリングメソッドがありますか?
-
[解決済み] Pythonで現在時刻を取得する方法
-
[解決済み] ファイルのコピー方法について教えてください。
-
[解決済み] Pythonでファイルやフォルダを削除する方法は?
-
[解決済み] pipでPythonの全パッケージをアップグレードする方法
-
[解決済み】ネストされたディレクトリを安全に作成するには?
-
[解決済み】Pythonに三項条件演算子はありますか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
PythonでECDSAを実装する方法 知っていますか?
-
[解決済み】pygame.error: ビデオシステムが初期化されていない
-
[解決済み】「SyntaxError.Syntax」は何ですか?Missing parentheses in call to 'print'」はPythonでどういう意味ですか?
-
[解決済み】TypeErrorを取得しました。エントリを持つ子テーブルの後に親テーブルを追加しようとすると、 __init__() missing 1 required positional argument: 'on_delete'
-
[解決済み] 'DataFrame' オブジェクトに 'sort' 属性がない
-
[解決済み】ImportError: bs4という名前のモジュールがない(BeautifulSoup)
-
[解決済み】NameError: 名前 'self' が定義されていません。
-
[解決済み] 指定された wget コマンドの Python 等価版
-
[解決済み】リクエストを使って画像をダウンロードする方法
-
[解決済み] file.flush()はいったい何をしているのですか?