一个Python进度条
在一堆旧文件里找到一个简单python的进度条,忘了是从哪里搞来的了… 效果如下:
[========> 25% ]
可以在初始化时设定进度条的宽度,最小值和最大值。 其实主要的原理就是Python的Print有一个简单的用法:
print somestring,
这样不会输出最后的换行,而如果把回车符号这样输出,就能起到抹去先前显示的内容的目的。
代码
代码如下:
# -*- coding: utf-8 -*- #!/usr/bin/env python import sys class progressBar: def __init__(self, minValue = 0, maxValue = 100, totalWidth=80): """初始化 """ self.bar = "[]" # 进度条字符串 self.min = minValue self.max = maxValue self.span = maxValue - minValue self.width = totalWidth self.amount = 0 # 进度值。 self.update(0) # 构造初始进度条字符串 def update(self, newAmount = 0): """ 用新数值更新进度条。 如果数值参数在最大值/最小值范围以外,则显示最大值/最小值。 """ if newAmount < self.min: newAmount = self.min if newAmount > self.max: newAmount = self.max self.amount = newAmount # 计算新的进度百分比,取整。 diffFromMin = float(self.amount - self.min) percentDone = (diffFromMin / float(self.span)) * 100.0 percentDone = int(round(percentDone)) # 计算显示某个进度所需要的条块 allFull = self.width - 2 numHashes = (percentDone / 100.0) * allFull numHashes = int(round(numHashes)) # 用'='和'>'号构造进度条字符串,对空和满格进行特殊处理 if numHashes == 0: self.bar = "[>%s]" % (' '*(allFull-1)) elif numHashes == allFull: self.bar = "[%s]" % ('='*allFull) else: self.bar = "[%s>%s]" % ('='*(numHashes-1), ' '*(allFull-numHashes)) # 计算百分比显示位置,基本位于中央 percentPlace = (len(self.bar) / 2) - len(str(percentDone)) percentString = str(percentDone) + "%" # 把百分比插入进度条 self.bar = ''.join([self.bar[0:percentPlace], percentString, self.bar[percentPlace+len(percentString):] ]) def __str__(self): return str(self.bar) def __call__(self, value): """ 更新进度数字,显示进度条。先输出一个回车,使显示能够覆盖当前行。 """ print '\r', self.update(value) sys.stdout.write(str(self)) sys.stdout.flush()
用法很简单,在任何python程序的循环里构造一个进度条对象, 指定进度条宽度和进度数,然后在更新进度条的时候print进度条对象:
def main(argv=None): # 从0开始,分255个步更新,宽度75 prog = progressBar(0, 255, 75) for n in range(255): n += 1 print prog(n), time.sleep(0.01) return 0
有个bug…显示进度条的行末会多一个”None”, 应该是某个空对象…

Discussion