Python中的简单不确定进度条

Python中的简单不确定进度条,python,optimization,coding-style,progress-bar,Python,Optimization,Coding Style,Progress Bar,即使我害怕有点离题,但我不知道还有什么地方可以问这个问题,对不起 我希望用Python构建一个**简单**不确定进度条 Python中有一个非常有效的p,但我的目标是构建一个简单的个人进度条,以便每次添加到代码中 下面是我的代码,当您知道数据的maxvalue时,它是一个简单的进度条 from __future__ import division import sys class Progress(object): def __init__(self, maxval):

即使我害怕有点离题,但我不知道还有什么地方可以问这个问题,对不起

我希望用Python构建一个
**简单**不确定进度条

Python中有一个非常有效的p,但我的目标是构建一个简单的个人进度条,以便每次添加到代码中

下面是我的代码,当您知道数据的
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()
现在,我希望创建一个新的类UndeterminateProgress(object),以便在数据的maxvalue未知时创建一个简单的不确定进度条

基本思路是从0打印到100,再从100打印到0,直到所有数据全部读取或全部处理(在Ethan Coon的帮助下进行代码更新,见下文)

在windows的命令提示下进行测试,100%后的进度条返回到0%,转到100%,但在此之后将创建一个新的进度条


其想法是只打印一行不确定的进度条,基本上你只需要将所有内容模化为maxval。在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()  

注意这里没有要求maxval为100。。。您可以将其设置为数据的任何“合理增量大小”。如果您要读取10亿个数据,并以每秒1000个的速度读取,那么您可能不希望增量大小为100;)

如果进度不确定,打印数字有什么意义?不如展示一些有趣的动画艺术怎么样?:)最初的想法是一个不确定的进度条,但我是一个开放的家伙=D!嗯,这在linux机器上不会发生在我身上。。。酒吧会像预期的那样永远向右、向左、向右、向左,只有一行。这个数字对我来说也是47%,可能应该是247%,这不难确定,但我不知道你为什么会得到第二行。呸,我的回答太慢了…真正的答案是100%的进度线是80个字符,谢谢@Ethan我用命令提示符测试了你的代码。问题是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()