Python进度栏和下载

我有一个python脚本,可启动一个可下载文件的URL。 有什么方法可以让python使用命令行显示与启动浏览器相反的下载进度?

user1607549 asked 2020-01-23T21:36:37Z
6个解决方案
80 votes

已更新您的示例网址:

我刚刚为此编写了一种超级简单的方法(将其略微修改),以将pdfs刮出某个站点。 请注意,由于Powershell无法处理“ \ r”,因此只能在基于UNIX的系统(Linux,Mac OS)上正常运行

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()

它使用了请求库,因此您需要安装它。 这会将类似以下内容的内容输出到您的控制台中:

>下载download.data

> [===============================

脚本中的进度条宽52个字符(2个字符只是[],所以进度条为50个字符)。 每个=代表下载量的2%。

Endophage answered 2020-01-23T21:37:19Z
57 votes

您可以使用“ 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

它也应该在多个平台上工作! 您也可以使用.dots和.mill而不是.bar将条形更改为点或微调器。

请享用!

Rich Jones answered 2020-01-23T21:37:52Z
15 votes

我很惊讶没有建议使用tqdm!enter image description here

kekkler answered 2020-01-23T21:38:12Z
11 votes

带有TQDM的Python 3

这是TQDM文档中建议的技术。

import urllib.request

from tqdm import tqdm


class DownloadProgressBar(tqdm):
    def update_to(self, b=1, bsize=1, tsize=None):
        if tsize is not None:
            self.total = tsize
        self.update(b * bsize - self.n)


def download_url(url, output_path):
    with DownloadProgressBar(unit='B', unit_scale=True,
                             miniters=1, desc=url.split('/')[-1]) as t:
        urllib.request.urlretrieve(url, filename=output_path, reporthook=t.update_to)
Chris Chute answered 2020-01-23T21:38:36Z
5 votes

我认为您也可以使用click,它也有一个不错的进度栏库。

import click
with click.progressbar(length=total_size, label='Downloading files') as bar:
    for file in files:
        download(file)
        bar.update(file.size)

请享用 !

Tian Zhang answered 2020-01-23T21:39:00Z
0 votes

您可以在此处流式下载->流式下载。

您也可以流式上传。

除非您尝试访问response.content,否则最重要的流请求已完成。只有两行

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

流请求

Vamsidhar Muggulla answered 2020-01-23T21:39:33Z
translate from https://stackoverflow.com:/questions/15644964/python-progress-bar-and-downloads