如何打印状态栏和百分比?
为了实现下面这样的状态栏:
[========== ] 45%
[================ ] 60%
[==========================] 100%
我想把这个输出到标准输出(stdout),并且保持刷新,不想换行。该怎么做呢?
23 个回答
128
我发现了一个很有用的库叫做 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
可以包裹任何可迭代的对象。
312
字符 '\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)
我不太确定这个在所有系统上是否都能用,但至少在Linux和OSX上是可以的。
179
有一个Python模块可以从PyPI下载,叫做progressbar
,它可以实现你需要的功能。如果你不介意增加一个依赖,这个解决方案挺不错的。否则,可以看看其他的回答。
下面是一个简单的使用示例:
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的话,可以用pip install progressbar
。