2016-06-01 18 views
12

かなりの(〜200MB)ファイルをダウンロードする必要があります。 hereでファイルをダウンロードして保存する方法を知りました。どのくらいダウンロードされたのかを知るためのプログレスバーがあるのは良いことです。私はProgressBarを見つけましたが、私は2つを一緒に組み込む方法がわかりません。リクエストバーでhttpを介してファイルをダウンロード中のプログレスバー

これは私が試したコードですが、動作しませんでした。

bar = progressbar.ProgressBar(max_value=progressbar.UnknownLength) 
with closing(download_file()) as r: 
    for i in range(20): 
     bar.update(i) 
+0

あなたが取得しているトレースバックエラーとは何ですか? – andrew

+0

なし、更新されません。 – Gamegoofs2

+0

興味深い。私たちは異なるバージョンを使用しているかもしれません。あなたの最初の行をコピー/ペーストすると、 "予想外のキーワード引数 'max_value'"が出ます。私はバージョン2.3を使用しています。 – andrew

答えて

25

私はあなたがtqdm [1]、それは非常に使いやすいですしてみてください示唆しています。 requestsライブラリをダウンロードするための コード例[2]:

from tqdm import tqdm 
import requests 
import math 


url = "http://example.com/bigfile.bin" 
# Streaming, so we can iterate over the response. 
r = requests.get(url, stream=True) 

# Total size in bytes. 
total_size = int(r.headers.get('content-length', 0)); 
block_size = 1024 
wrote = 0 
with open('output.bin', 'wb') as f: 
    for data in tqdm(r.iter_content(block_size), total=math.ceil(total_size//block_size) , unit='KB', unit_scale=True): 
     wrote = wrote + len(data) 
     f.write(data) 
if total_size != 0 and wrote != total_size: 
    print("ERROR, something went wrong") 

[1]:https://github.com/tqdm/tqdm
[2]:http://docs.python-requests.org/en/master/

+0

私は何かが欠落しているかどうかはわかりませんが、それは私のためのプログレスバーを表示しません。ちょうど数字(tqdmは合計サイズを知りませんので、私は思っています) – Juicy

+0

ええ、パラメータとして渡します: 'total = int(r.headers.get( 'content-length')); ... tqdm(r.iter_content()、total = total)... ' – Juicy

+0

ありがとう!人間が読める統計情報のための 'tqdm()'呼び出しに 'unit = 'B'、unit_scale = True'を追加してください。 – Willem

2

リモートファイルのサイズを取得する必要があるとしているように思えます(answered here)あなたがどれほど遠くにあるかを計算します。各チャンクの処理中に

あなたは、あなたは合計サイズとチャンクの大きさを知っていれば、あなたはプログレスバーを更新する際に把握することができます...あなたのプログレスバーを更新することができます。

3

Progress Bar Usageページの例とどのようなコードが実際に必要との間に切断があるようです。次の例で

maxval代わりにmax_valueを使用しません。 .start()を使用してバーを初期化することにも注意してください。これはIssueに記載されています。

import progressbar 
import requests 

url = "http://stackoverflow.com/" 


def download_file(url): 
    local_filename = 'test.html' 
    r = requests.get(url, stream=True) 
    f = open(local_filename, 'wb') 
    file_size = int(r.headers['Content-Length']) 
    chunk = 1 
    num_bars = file_size/chunk 
    bar = progressbar.ProgressBar(maxval=num_bars).start() 
    i = 0 
    for chunk in r.iter_content(): 
     f.write(chunk) 
     bar.update(i) 
     i+=1 
    f.close() 
    return 

download_file(url) 
関連する問題