1

urllib2 でファイルをダウンロードしたいのですが、進行状況バーを表示したいのですが、実際にダウンロードされたファイルサイズを取得するにはどうすればよいですか?

私の現在のコードは

ul = urllib2.urlopen('www.file.com/blafoo.iso')
data = ul.get_data()

また

open('file.iso', 'w').write(ul.read())

ダウンロード全体が Web サイトから受信された場合、データは最初にファイルに書き込まれます。ダウンロードしたデータサイズにアクセスするにはどうすればよいですか?

ご協力いただきありがとうございます

4

3 に答える 3

7

素晴らしいリクエストライブラリとプログレスバー ライブラリを使用したテキスト プログレス バーの例を次に示します。

import requests
import progressbar

ISO = "http://www.ubuntu.com/start-download?distro=desktop&bits=32&release=lts"
CHUNK_SIZE = 1024 * 1024 # 1MB

r = requests.get(ISO)
total_size = int(r.headers['content-length'])
pbar = progressbar.ProgressBar(maxval=total_size).start()

file_contents = ""
for chunk in r.iter_content(chunk_size=CHUNK_SIZE):
    file_contents += chunk
    pbar.update(len(file_contents))

これは、実行中にコンソールに表示されるものです。

$ python requests_progress.py
 90% |############################   |

編集:いくつかのメモ:

  • すべてのサーバーが content-length ヘッダーを提供するわけではないため、その場合、パーセンテージを提供することはできません
  • ファイルが大きい場合、メモリ内のファイル全体を読みたくない場合があります。チャンクをファイルまたは別の場所に書き込むことができます。
于 2012-08-06T15:46:36.557 に答える
4

にアクセスするために使用できるよりも、infoを返すurllib2の関数を使用できます。the meta-information of the pagegetheadersContent-Length

たとえば、のダウンロードサイズを計算してみましょうUbuntu 12.04 ISO

>>> info = urllib2.urlopen('http://mirror01.th.ifl.net/releases//precise/ubuntu-12.04-desktop-i386.iso')
>>> size = int(info.info().getheaders("Content-Length")[0])
>>> size/1024/1024
701
>>>
于 2012-08-06T15:25:23.677 に答える
1
import urllib2
with open('file.iso', 'wb') as output: # Note binary mode otherwise you'll corrupt the file
    with urllib2.urlopen('www.file.com/blafoo.iso') as ul:
        CHUNK_SIZE = 8192
        bytes_read = 0
        while True:
            data = ul.read(CHUNK_SIZE)
            bytes_read += len(data) # Update progress bar with this value
            output.write(data)
            if len(data) < CHUNK_SIZE: #EOF
                break
于 2012-08-06T15:16:36.220 に答える