Python Progressbar更新?

时间:2016-12-12 20:43:26

标签: python module percentage

我想使用Python模块进度条。

在我的情况下,我想在大型列表中搜索一个单词。这有效。所以我认为进度条会很好。我导入了模块并尝试了它:

path = str(raw_input(PATH))
word = str(raw_input(WORD))
widgets = ['Suche Wort: ', pb.Percentage(), ' ',  
            pb.Bar(marker=pb.RotatingMarker()), ' ', pb.ETA()]
timer = pb.ProgressBar(widgets=widgets, maxval=10).start()
loc = -1

with open(path) as f:
    for n in range(0,10):
        timer.update(n)
        for i, line in enumerate(f):
            if word in line:
                timer.update(n)
                loc = i
                break
    timer.finish()

但是有一个问题..进度条停在0%。当整个循环结束时它会跳到100%。为什么?!我不明白。

提前谢谢:)!

1 个答案:

答案 0 :(得分:0)

我怀疑你一次试图将计时器增加10%。但是,你有一个小错误。从f读取和更新计时器之间的顺序。

with open(path) as f:
    for n in range(0,10):
        timer.update(n)
        for i, line in enumerate(f):
            ...
    timer.finish()

第一次循环运行时,您调用timer.update(0)。然后,您从该文件中读取所有项目。实际上,您从文件中的当前位置开始,逐行读取,直到文件中没有其他行。

下一次迭代,您更新进度条:timer.update(1)。然后,您从文件中读取所有项目,从文件描述符指向的位置开始,即在文件的末尾。从文件末尾到文件末尾的读取完全没有时间,因此您可以立即拨打timer.update(2),一直到最后。

您为进度条任意选择了10个步骤,我怀疑这与f中的行数无关。如果您知道f中的行数,则可以在每次迭代或每1000次迭代(if i % 1000 == 0:)中更新进度条。如果不这样做,你必须弄清楚到目前为止你读过多少字节(例如通过计算你读取的行的长度),然后查看文件的大小,并将这些数字用作进度条的基础。