如何使用带有 urlretrieve 的进度条模块

新手上路,请多包涵

我的 pyhton3 脚本使用 urlretrieve 通过 Internet 下载许多图像,我想为每次下载添加一个进度条,其中包含 完成百分比 和 _下载速度_。

progressbar 模块似乎是一个很好的解决方案,但尽管我已经查看了 他们的示例,并且 example4 似乎是正确的,但我仍然无法理解如何将它包装在 urlretrieve 周围。

我想我应该添加第三个参数:

 urllib.request.urlretrieve('img_url', 'img_filename', some_progressbar_based_reporthook)

但是我该如何正确定义它呢?

原文由 Vasily 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1k
2 个回答

我认为更好的解决方案是创建一个具有所有需要状态的类

import progressbar

class MyProgressBar():
    def __init__(self):
        self.pbar = None

    def __call__(self, block_num, block_size, total_size):
        if not self.pbar:
            self.pbar=progressbar.ProgressBar(maxval=total_size)
            self.pbar.start()

        downloaded = block_num * block_size
        if downloaded < total_size:
            self.pbar.update(downloaded)
        else:
            self.pbar.finish()

并致电:

 urllib.request.urlretrieve('img_url', 'img_filename', MyProgressBar())

原文由 George C 发布,翻译遵循 CC BY-SA 4.0 许可协议

另一个答案中的建议对我来说没有超过 1%。这是一个适用于 Python 3 的完整实现:

 import progressbar
import urllib.request

pbar = None

def show_progress(block_num, block_size, total_size):
    global pbar
    if pbar is None:
        pbar = progressbar.ProgressBar(maxval=total_size)
        pbar.start()

    downloaded = block_num * block_size
    if downloaded < total_size:
        pbar.update(downloaded)
    else:
        pbar.finish()
        pbar = None

urllib.request.urlretrieve(model_url, model_file, show_progress)

原文由 Nic Dahlquist 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题