Python动态长度进度条

4
我正在编写一个网页爬虫来发现链接和处理页面信息。
由于这可能是一个没有结束的过程,因此在构建进度条时我不知道有多少元素已经完成,例如5个链接已完成/谁知道我们何时完成。
但是我知道我访问了多少链接和检测到了多少链接。
所以是已访问链接数/检测到的链接数。
我想要做的是使用类似click或其他api来制作进度条。
进度条的长度可以改变,即我可以更新检测到的进度条...就像加载条,用户已经完成90%,突然降到10%。噢,糟糕了lol'
查看click 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)

进度条

我能用 click 进度条实现上面所描述的功能吗?

如果不能,我需要什么来制作一个进度条,其中完成值会改变...90% -> 10% -> 20%。

谢谢!

编辑:更多细节

我有一个对象列表,称为 LinkElements。这些元素具有 visited 布尔值。

我想可能可以更新迭代器:

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个回答

3

虽然不支持此功能,但您可以使用click函数来实现您所需的功能。

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.pos0,则会出现除以零的错误。这个+1是为了避免这种情况。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接