Python中的简单不确定进度条

3 投票
1 回答
1784 浏览
提问于 2025-04-17 19:59

虽然我有点担心这个话题可能不太相关,但我不知道该去哪里问这个问题,抱歉!

我想在Python中制作一个**简单的**不确定进度条

Python中有一个非常不错的进度条模块,可以在这里找到,但我想做一个简单的个人进度条,方便我每次在代码中使用。

下面的代码是一个简单的进度条,适用于你知道数据的maxvalue时。

from __future__ import division
import sys


class Progress(object):
    def __init__(self, maxval):
        self._pct = 0
        self.maxval = maxval

    def update(self, value):
        pct = int((value / self.maxval) * 100.0)
        if self._pct != pct:
            self._pct = pct
            self.display()

    def start(self):
        self.update(0)

    def finish(self):
        self.update(self.maxval)

    def display(self):
        sys.stdout.write("\r|%-73s| %d%%" % ('#' * int(self._pct*.73), self._pct))
        sys.stdout.flush()


import time

toolbar_width = 300
pbar = Progress(toolbar_width)
pbar.start()
for i in xrange(toolbar_width):
    time.sleep(0.1) # do real work here
    pbar.update(i)
pbar.finish()

现在我想创建一个新的类叫做IndeterminateProgress(object),目的是在不知道数据的最大值时,制作一个简单的不确定进度条。

基本的想法是从0打印到100,然后再从100打印回0,一直循环,直到所有数据都读取完或者处理完(这段代码是经过Ethan Coon的帮助更新的,见下文)。

    class IndeterminateProgress(object):
    def __init__(self):
        self._pct = 0
        self.maxval = 100

    def update(self,value):
        abs_pct = value % self.maxval   # this gives the percentage change from maxval
        phase = int(value / self.maxval) % 2  # this gives whether the bar is increasing or decreasing in size
        if phase == 0:
            rel_pct = abs_pct / self.maxval * 100
        else:
            rel_pct = (self.maxval - abs_pct) / self.maxval * 100
        if (rel_pct != self._pct):
            self._pct = rel_pct
            self.display()

    def start(self):
        self.update(0)

    def display(self):
        sys.stdout.write("\r|%-73s| %d%%" % ('#' * int(self._pct*.73), self._pct))
        sys.stdout.flush()


data_flush = 30000000
pbar = IndeterminateProgress()
for i in xrange(data_flush):
    time.sleep(0.1) # do real work here
    pbar.update(i)

在Windows的命令提示符下测试时,进度条在达到100%后会回到0%,然后再到100%,但之后会创建一个新的进度条。

enter image description here

这个想法是只打印一行不确定的进度条。

1 个回答

1

基本上,你只需要把所有东西都用最大值来取余。 在Python中,取余是用%这个符号来完成的。

def update(self,value):
    abs_pct = value % self.maxval   # this gives the percentage change from maxval
    phase = int(value / self.maxval) % 2  # this gives whether the bar is increasing or decreasing in size
    if phase == 0:
        rel_pct = abs_pct / self.maxval * 100
    else:
        rel_pct = (self.maxval - abs_pct) / self.maxval * 100

    if (rel_pct != self._pct):
        self._pct = rel_pct
        self.display()  

注意,这里并没有规定最大值一定是100……你可以把它设置成适合你数据的“合理增量大小”。如果你有10亿条数据要读取,而你每秒只能处理1000条,可能你就不想把增量大小设成100;)

撰写回答