具有动态长度的Python进度条

时间:2015-09-23 00:14:29

标签: python

我正在编写一个网络抓取工具,可以发现链接并处理网页信息。

由于这可能是一个没有结束的过程,我不知道在构建进度条时我有多少元素,比如完成了5个链接/谁知道我们什么时候完成。

但我知道我访问了多少链接以及我检测到了多少链接。

访问/检测到链接的链接数量。

我想做的是使用点击或类似的api来制作进度条。

栏的长度可以改变,即我可以更新检测到的栏...想一个加载栏,用户是90%,突然下降到10%。哇笨蛋哈哈'

查看点击API,似乎有两种方法可以使用他们的进度条。

with click.progressbar(all_the_users_to_process) as bar:
for user in bar:
    modify_the_user(user)

with click.progressbar(length=total_size,
                   label='Unzipping archive') as bar:
for archive in zip_file:
    archive.extract()
    bar.update(archive.size)

Progress Bar

我可以使用点击进度条制作我上面描述的内容吗?

如果我不能做什么我需要制作一个进度条,其中完成的值随着变化而变化... 90% - > 10% - > 20%。

谢谢!

编辑:更多详情

我有一个名为LinkElements的对象列表。这些元素有一个访问过的布尔值。

我以为我可以更新迭代器:

with click.progressbar(like_elements_list) as link_elements:
    for link in link_elements:
        ... do stuff with link ....
        link_elements.update(like_elements_list)

这个想法似乎不起作用......或者我不理解它

1 个答案:

答案 0 :(得分:1)

它不受支持,但您可以使用点击来提供您正在寻找的功能。

import click

links_visited = 0
links_detected = 100

with click.progressbar(length=1000) as bar:
    for link in link_elements_list:

        # ... do stuff ...

        links_visited += 1
        links_detected += 0 # Increment how many more new links were found

        progress = float(links_visited) / float(links_detected)
        bar.pos = int(progress * 999) + 1
        bar.update(0)

您可以通过bar.pos手动移动进度条,然后调用update(0)。由于update()方法以增量方式工作,因此您只需传入0即可进行渲染。

现在,我必须注意以下几点:

  • length=1000我正在对1000的值进行硬编码,因此我们可以提供介于0-1000之间的“百分比”。
  • bar.pos = int(progress * 999) + 1为什么+1?好吧,当你致电update()时,它会尝试计算平均时间,这意味着bar.pos 0,你会得到零除错误。 +1是为了避免这种情况。