即使我害怕有点偏离主题,但我不知道还有什么要问这个,抱歉!
我希望在Python中构建**simple** indeterminate progress bar
Python中有一个非常有效的p rogression bar module,但我的目标是构建一个简单的个人进度条,每次都添加到我的代码中
以下我的代码当您知道数据的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),以便在数据的maxvalue未知时创建一个简单的不确定进度条。
基本思想是打印从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%,但在此之后会创建一个新的进度条。
这个想法只打印了一行不确定的进度条
答案 0 :(得分:1)
基本上你只想要以maxval为模的一切。在python中,modulo是使用%运算符完成的。
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;)