2016-12-12 5 views
0

私はこの答えのためにワールドワイドウェブを検索しようとしていますが、答えがノーかもしれないと感じています。私は、Python 3.5とと呼ばれるライブラリを使用して、urllib.request.urlopen(url)というメソッドを使用してリンクを開き、ファイルをダウンロードしています。Python(3.5) - urllib.request.urlopen - プログレスバーを利用できますか?

ファイルが200MBを超えているので、何らかの進歩の尺度を持っているとよいでしょう。私はAPI hereを見ていますが、フック付きのパラメータは表示されません。

は、ここに私のコードです:

downloadURL = results[3] #got this from code earlier up 
rel_path = account + '/' + eventID + '_' + title + '.mp4' 

filename_abs_path = os.path.join(script_dir, rel_path) 
print('>>> Downloading >>> ' + title) 

# Download .mp4 from a url and save it locally under `file_name`: 
with urllib.request.urlopen(downloadURL) as response, open(filename_abs_path, 'wb') as out_file: 
    shutil.copyfileobj(response, out_file) 

彼らは私が潜在的にプログレスバーを持つことができるか、唯一の方法は別のライブラリを使用することであろうと思えば誰でも洞察を提供することはできますか?私はコードを非常に短くシンプルに保つために探しています、私はちょうどダウンロードされているファイルのいくつかの兆候が必要です。何か助けてくれてありがとう!

+0

これは本当に 'urllib 'には関係ありませんか?むしろ問題は 'copyfileobj()'が進捗状況コールバックを提供しないということです。だから[dup](http://stackoverflow.com/questions/29967487/get-progress-back-from-shutil-file-copy-thread)? – dhke

+0

[python requests](http://docs.python-requests.org/)に切り替えることをお勧めします – Gonzo

+0

プログレスバーを作成するには、ダウンロードしようとしているデータの合計サイズを知る必要があります。ダウンロードされた部分の現在のサイズ最初のものは 'Content-Length'ヘッダから取り出すことができます。指定されたサイズのデータ​​を読み込み、チャンクの長さの合計を計算することで、2番目のデータを計算することができます。 'requests'ライブラリは、あなたが接続からデータのチャンクを読み込むことを可能にします。 – ForceBru

答えて

1

応答にcontent-lengthが含まれている場合は、着信データをブロック単位で読み取り、完了率を計算できます。残念ながら、応答を「チャンク」するWebサーバーは常にコンテンツの長さを提供するわけではないため、必ずしも機能しません。次に、テストする例を示します。

import urllib.request 
import sys 
import io 

try: 
    url = sys.argv[1] 
except IndexError: 
    print("usage: test.py url") 
    exit(2) 

resp = urllib.request.urlopen(url) 
length = resp.getheader('content-length') 
if length: 
    length = int(length) 
    blocksize = max(4096, length//100) 
else: 
    blocksize = 1000000 # just made something up 

print(length, blocksize) 

buf = io.BytesIO() 
size = 0 
while True: 
    buf1 = resp.read(blocksize) 
    if not buf1: 
     break 
    buf.write(buf1) 
    size += len(buf1) 
    if length: 
     print('{:.2f}\r done'.format(size/length), end='') 
print() 
+0

お返事ありがとうございます。私は別のファイルでこれを試して、エラー24行目 'TypeError: 'float' object is iterable'ではありません。 – Kenny

+0

私はフロア分割をしていたはずです。この例を 'blocksize = max(4096、length // 100)'に変更しました。 (私は小さなファイルでしかテストしませんでした!) – tdelaney

+0

素敵な、そのコードは動作しています。ダウンロードにどのように適用できるのか分かりますか?私はそれを微調整し、 'urllib.request.urlopen'を使って' urlib.request.urlopen'の下に置きますか? – Kenny

関連する問題