94

ダウンロード可能なファイルである URL を起動する Python スクリプトがあります。ブラウザを起動するのではなく、Python にダウンロードの進行状況を表示させる方法はありますか?

4

11 に答える 11

135

特定のサイトからPDFをスクレイピングするための、これに対する非常に単純な(少しハックな)アプローチを作成しました。PowerShell は以下を処理しないため、Unix ベースのシステム (Linux、Mac OS) でのみ正しく動作することに注意してください"\r"

import sys
import requests

link = "http://indy/abcde1245"
file_name = "download.data"
with open(file_name, "wb") as f:
    print("Downloading %s" % file_name)
    response = requests.get(link, stream=True)
    total_length = response.headers.get('content-length')

    if total_length is None: # no content length header
        f.write(response.content)
    else:
        dl = 0
        total_length = int(total_length)
        for data in response.iter_content(chunk_size=4096):
            dl += len(data)
            f.write(data)
            done = int(50 * dl / total_length)
            sys.stdout.write("\r[%s%s]" % ('=' * done, ' ' * (50-done)) )    
            sys.stdout.flush()

requests ライブラリを使用するため、それをインストールする必要があります。これにより、次のようなものがコンソールに出力されます。

>download.dataのダウンロード

>[============= ]

進行状況バーは、スクリプト内で 52 文字幅です (2 文字は単純に[]50 文字の進行状況です)。それぞれ=がダウンロードの 2% を表します。

于 2013-03-26T18:50:52.853 に答える
77

clint」パッケージ (「requests」と同じ作成者によって作成された) を使用して、次のようにダウンロードに簡単な進行状況バーを追加できます。

from clint.textui import progress

r = requests.get(url, stream=True)
path = '/some/path/for/file.txt'
with open(path, 'wb') as f:
    total_length = int(r.headers.get('content-length'))
    for chunk in progress.bar(r.iter_content(chunk_size=1024), expected_size=(total_length/1024) + 1): 
        if chunk:
            f.write(chunk)
            f.flush()

これにより、次のような動的出力が得られます。

[################################] 5210/5210 - 00:00:01

複数のプラットフォームでも動作するはずです! .bar の代わりに .dots と .mill を使用して、バーをドットまたはスピナーに変更することもできます。

楽しみ!

于 2014-01-06T05:19:15.107 に答える
7

clickを使用することもできます。プログレスバー用の優れたライブラリがあります。

import click

with click.progressbar(length=total_size, label='Downloading files') as bar:
    for file in files:
        download(file)
        bar.update(file.size)
于 2016-06-23T14:50:18.437 に答える
4

別の良いオプションはwget次のとおりです。

import wget
wget.download('http://download.geonames.org/export/zip/US.zip')

出力は次のようになります。

11% [........                                     ] 73728 / 633847

ソース: https://medium.com/@petehouston/download-files-with-progress-in-python-96f14f6417a2

于 2021-03-31T23:09:18.763 に答える
-1

ここにあるようにダウンロードをストリーミングできます-> Stream a Download

また、アップロードをストリーミングすることもできます。

わずか 2 行で response.content にアクセスしようとしない限り、最も重要なリクエストのストリーミングが行われます。

for line in r.iter_lines():    
    if line:
        print(line)

ストリーム リクエスト

于 2016-10-22T06:36:41.483 に答える