Python来打印出状态栏和百分比

要实现如下的状态栏:

[========== ] 45% [================ ] 60% [==========================] 100% 

我想这个被打印出来,并不断刷新它,而不是打印到另一行。 这个怎么做?

有一个Python模块,你可以从PyPI调用progressbar来实现这样的function。 如果你不介意添加依赖项,这是一个很好的解决scheme。 否则,去其他答案之一。

一个简单的例子来说明如何使用它:

 import progressbar from time import sleep bar = progressbar.ProgressBar(maxval=20, \ widgets=[progressbar.Bar('=', '[', ']'), ' ', progressbar.Percentage()]) bar.start() for i in xrange(20): bar.update(i+1) sleep(0.1) bar.finish() 

要安装它,您可以使用easy_install progressbar ,或者如果您喜欢点子,则可以使用pip install progressbar

'\r'字符(回车符)将光标重新设置到行的开头,并允许您写入以前在行上的内容。

 from time import sleep import sys for i in range(21): sys.stdout.write('\r') # the exact output you're looking for: sys.stdout.write("[%-20s] %d%%" % ('='*i, 5*i)) sys.stdout.flush() sleep(0.25) 

我不能100%确定它是否可以在所有系统中完全移植,但是它至less可以在Linux和OSX上运行。

我发现有用的库tqdm( https://github.com/tqdm/tqdm/ ,以前: https : //github.com/noamraph/tqdm )。 它会自动估计完成时间,并可以用作迭代器。

用法:

 import tqdm import time for i in tqdm.tqdm(range(1000)): time.sleep(0.01) # or other long operations 

结果是:

 |####------| 450/1000 45% [elapsed: 00:04 left: 00:05, 99.15 iters/sec] 

tqdm可以包装任何迭代。

您可以使用\r ( 回车 )。 演示:

 import sys total = 10000000 point = total / 100 increment = total / 20 for i in xrange(total): if(i % (5 * point) == 0): sys.stdout.write("\r[" + "=" * (i / increment) + " " * ((total - i)/ increment) + "]" + str(i / point) + "%") sys.stdout.flush() 

在这里你可以使用下面的代码作为一个函数:

 def drawProgressBar(percent, barLen = 20): sys.stdout.write("\r") progress = "" for i in range(barLen): if i < int(barLen * percent): progress += "=" else: progress += " " sys.stdout.write("[ %s ] %.2f%%" % (progress, percent * 100)) sys.stdout.flush() 

基于以上的答案和其他类似的关于CLI进度条的问题,我想我得到了一个普遍的答案。 检查它在https://stackoverflow.com/a/15860757/2254146

这里是function的副本,但修改,以适应你的风格:

 import time, sys # update_progress() : Displays or updates a console progress bar ## Accepts a float between 0 and 1. Any int will be converted to a float. ## A value under 0 represents a 'halt'. ## A value at 1 or bigger represents 100% def update_progress(progress): barLength = 20 # Modify this to change the length of the progress bar status = "" if isinstance(progress, int): progress = float(progress) if not isinstance(progress, float): progress = 0 status = "error: progress var must be float\r\n" if progress < 0: progress = 0 status = "Halt...\r\n" if progress >= 1: progress = 1 status = "Done...\r\n" block = int(round(barLength*progress)) text = "\rPercent: [{0}] {1}% {2}".format( "="*block + " "*(barLength-block), progress*100, status) sys.stdout.write(text) sys.stdout.flush() 

好像

百分比:[====================] 99.0%

基于这里和其他地方的一些答案,我写了这个简单的函数,它显示了一个进度条和经过/估计的剩余时间。 应该在大多数基于Unix的机器上工作。

 import time import sys percent = 50.0 start = time.time() draw_progress_bar(percent, start) def draw_progress_bar(percent, start, barLen=20): sys.stdout.write("\r") progress = "" for i in range(barLen): if i < int(barLen * percent): progress += "=" else: progress += " " elapsedTime = time.time() - start; estimatedRemaining = int(elapsedTime * (1.0/percent) - elapsedTime) if (percent == 1.0): sys.stdout.write("[ %s ] %.1f%% Elapsed: %im %02is ETA: Done!\n" % (progress, percent * 100, int(elapsedTime)/60, int(elapsedTime)%60)) sys.stdout.flush() return else: sys.stdout.write("[ %s ] %.1f%% Elapsed: %im %02is ETA: %im%02is " % (progress, percent * 100, int(elapsedTime)/60, int(elapsedTime)%60, estimatedRemaining/60, estimatedRemaining%60)) sys.stdout.flush() return 

这是一个相当简单的方法,可以用于任何循环。

 #!/usr/bin/python for i in range(100001): s = ((i/5000)*'#')+str(i)+(' %') print ('\r'+s), 

如果你正在开发一个命令行界面,我build议你看看click哪个是非常好的:

 import click import time for filename in range(3): with click.progressbar(range(100), fill_char='=', empty_char=' ') as bar: for user in bar: time.sleep(0.01) 

在这里你得到的输出:

 $ python test.py [====================================] 100% [====================================] 100% [========= ] 27% 

今天,我从Mark Rushakoff那里尝试了这个解决scheme之后,就遇到了这个问题

 from time import sleep import sys for i in range(21): sys.stdout.write('\r') # the exact output you're looking for: sys.stdout.write("[%-20s] %d%%" % ('='*i, 5*i)) sys.stdout.flush() sleep(0.25) 

我可以这样说,这在64位python 3.4.3,但只在本地控制台W7-64工作正常。 但是当使用spyder 3.0.0dev的内置控制台时,换行符仍然存在。 由于这花了我一些时间,我想在这里报告这个观察。