57

http 経由でファイルをダウンロードするための小さなアプリケーションを作成しています (たとえば、ここで説明されているように)。

また、ダウンロードの進行状況のパーセンテージを示す小さなダウンロード進行状況インジケーターも含めたいと思います。

これが私が思いついたものです:

    sys.stdout.write(rem_file + "...")    
    urllib.urlretrieve(rem_file, loc_file, reporthook=dlProgress)

    def dlProgress(カウント、ブロックサイズ、合計サイズ):
      パーセント = int(count*blockSize*100/totalSize)
      sys.stdout.write("%2d%%" % パーセント)
      sys.stdout.write("\b\b\b")
      sys.stdout.flush()

出力: MyFileName... 9%

これを行うための他のアイデアや推奨事項はありますか?

少し厄介なのは、端末のパーセンテージの最初の桁でカーソルが点滅することです。これを防ぐ方法はありますか?カーソルを非表示にする方法はありますか?

編集:

ここでは、dlProgress のファイル名と '\r' コードにグローバル変数を使用するより良い代替手段を示します。

    global rem_file # dlProgress で使用するグローバル変数

    urllib.urlretrieve(rem_file, loc_file, reporthook=dlProgress)

    def dlProgress(カウント、ブロックサイズ、合計サイズ):
      パーセント = int(count*blockSize*100/totalSize)
      sys.stdout.write("\r" + rem_file + "...%d%%" % パーセント)
      sys.stdout.flush()

出力: MyFileName...9%

そして、カーソルは行末に表示されます。ずっといい。

4

10 に答える 10

18

Python 用のテキスト プログレス バー ライブラリが http://pypi.python.org/pypi/progressbar/2.2にあります。

このライブラリは、テキスト モードの進行状況バーを提供します。これは通常、実行時間の長い操作の進行状況を表示するために使用され、処理が進行中であることを視覚的に示します。

ProgressBar クラスは進行状況を管理し、行の形式は多数のウィジェットによって指定されます。ウィジェットは、進行状況に応じてさまざまに表示されるオブジェクトです。ウィジェットには次の 3 つのタイプがあります。 - 常にそれ自体を表示する文字列。- update メソッドが呼び出されるたびに異なる値を返すことができる ProgressBarWidget。および - ProgressBarWidgetHFill。ProgressBarWidget と似ていますが、拡張して線の残りの幅を埋める点が異なります。

プログレスバー モジュールは非常に使いやすく、しかも非常に強力です。また、利用可能な場合は自動サイズ変更などの機能を自動的にサポートします。

于 2008-09-09T04:48:28.203 に答える
15

あなたも試してみてください:

sys.stdout.write("\r%2d%%" % percent)
sys.stdout.flush()

複数のバックスペースではなく、文字列の先頭に 1 つのキャリッジ リターンを使用します。カーソルはまだ点滅しますが、最初の数字の下ではなくパーセント記号の後で点滅し、3 つではなく 1 つの制御文字を使用すると、ちらつきが少なくなる場合があります。

于 2008-09-09T04:21:09.157 に答える
7

価値のあるものとして、これを機能させるために使用したコードを次に示します。

from urllib import urlretrieve
from progressbar import ProgressBar, Percentage, Bar

url = "http://......."
fileName = "file"
pbar = ProgressBar(widgets=[Percentage(), Bar()])
urlretrieve(url, fileName, reporthook=dlProgress)

def dlProgress(count, blockSize, totalSize):
    pbar.update( int(count * blockSize * 100 / totalSize) )
于 2016-03-15T21:52:32.137 に答える
4

このパッケージを使用するcurses と、コンソールをより細かく制御できます。また、コードが複雑になるため、大規模なコンソール ベースのアプリを開発する場合を除き、おそらく不要です。

|, \, -, /簡単な解決策として、ステータス メッセージ (カーソルの点滅の下で実際に見栄えのする一連の文字) の最後に常に糸車を置くことができます。

于 2008-09-09T04:14:37.393 に答える
1

私はこのコードを使用しました:

url = (<file location>)
file_name = url.split('/')[-1]
u = urllib2.urlopen(url)
f = open(file_name, 'wb')
meta = u.info()
file_size = int(meta.getheaders("Content-Length")[0])
print "Downloading: %s Bytes: %s" % (file_name, file_size)

file_size_dl = 0
block_sz = 8192
while True:
    buffer = u.read(block_sz)
    if not buffer:
        break

    file_size_dl += len(buffer)
    f.write(buffer)
    status = r"%10d [%3.2f%%]" % (file_size_dl, file_size_dl * 100. / file_size)
    status = status + chr(8)*(len(status)+1)
    print status,

f.close()
于 2013-01-02T14:01:43.940 に答える
1
def download_progress_hook(count, blockSize, totalSize):
  """A hook to report the progress of a download. This is mostly intended for users with slow internet connections. Reports every 5% change in download progress.
  """
  global last_percent_reported
  percent = int(count * blockSize * 100 / totalSize)

  if last_percent_reported != percent:
    if percent % 5 == 0:
      sys.stdout.write("%s%%" % percent)
      sys.stdout.flush()
    else:
      sys.stdout.write(".")
      sys.stdout.flush()

    last_percent_reported = percent

urlretrieve(url, filename, reporthook=download_progress_hook)
于 2017-04-18T14:43:56.927 に答える
0

小さなファイルの場合、おかしなパーセンテージを避けるために、次の行が必要になる場合があります。

sys.stdout.write("\r%2d%%" % パーセント)

sys.stdout.flush()

乾杯

于 2009-04-01T10:04:19.397 に答える
0

それが私があなたを助けることができる方法です: https://github.com/mouuff/MouDownloader/blob/master/api/download.py

于 2012-10-14T08:31:23.217 に答える
0

いつものようにパーティーに遅刻。core のように、進行状況の報告をサポートする実装を次に示しますurlretrieve

import urllib2

def urlretrieve(urllib2_request, filepath, reporthook=None, chunk_size=4096):
    req = urllib2.urlopen(urllib2_request)

    if reporthook:
        # ensure progress method is callable
        if hasattr(reporthook, '__call__'):
            reporthook = None

        try:
            # get response length
            total_size = req.info().getheaders('Content-Length')[0]
        except KeyError:
            reporthook = None

    data = ''
    num_blocks = 0

    with open(filepath, 'w') as f:
        while True:
            data = req.read(chunk_size)
            num_blocks += 1
            if reporthook:
                # report progress
                reporthook(num_blocks, chunk_size, total_size)
            if not data:
                break
            f.write(data)

    # return downloaded length
    return len(data)
于 2015-02-10T04:38:33.730 に答える
0

106% などの進行状況の値を回避するには、以下のロジックに従います。

percent = min(int(count * blockSize * 100 / totalSize), 100)
于 2022-01-18T05:23:42.140 に答える