3

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

我希望**simple** indeterminate progress bar用 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%,但在此之后会创建一个新的进度条。

在此处输入图像描述

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

4

1 回答 1

1

基本上你只想要一切以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 ;)

于 2013-03-22T16:03:27.460 回答