如何打印状态栏和百分比?

214 投票
23 回答
292876 浏览
提问于 2025-04-15 23:43

为了实现下面这样的状态栏:

[==========                ]  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

撰写回答