如何在终端中重写输出

22 投票
4 回答
17861 浏览
提问于 2025-04-16 02:49

我有一个Python脚本,我想让它在终端上显示一个从0到100%的递增数字。我知道怎么在终端上打印数字,但我想知道怎么“重写”这些数字,让0变成1,1变成2,依此类推,一直到100。

4 个回答

3

使用 blessings这个包 - 清屏(也就是让屏幕变空,像在命令行里输入clear或cls),然后输入:

import sys
from blessings import Terminal
from time import sleep # <- boy, does this sound tempting a.t.m.

term = Terminal()
for i in range(6):
    with term.location(term.width - 3, term.height - 3):        
        print('{}'.format(i))
    sleep(2)
    if (i == 3):
        print('what was I doing, again?')
print('done')

如果你想从CheeseShop安装它,只需要...

pip install blessings
5

这个食谱 在这里 应该会对你有帮助。使用那个模块作为 tc,下面的代码就能实现你想要的功能:

from tc import TerminalController
from time import sleep
import sys

term = TerminalController()

for i in range(10):
    sys.stdout.write("%3d" % i)
    sys.stdout.flush()
    sleep(2)
    sys.stdout.write(term.BOL + term.CLEAR_EOL)

这个食谱使用了 terminfo 来获取终端的信息,并且在 Linux 和 OS X 的多个终端上都能工作。不过,它在 Windows 上是无法使用的。(感谢 piquadrat 的测试,正如下面的评论所说)。

编辑:这个食谱还提供了使用颜色和重写部分行的功能。它还包含一个现成的文本进度条。

26

打印一个回车符(\r)而不换行,会把光标移到当前行的开头,这样下一次打印的内容就会覆盖掉之前打印的内容:

import time
import sys
for i in range(100):
    print i,
    sys.stdout.flush()
    time.sleep(1)
    print "\r",

这样并不会清空这一行,所以如果你用这种方法打印递减的数字,你会看到之前打印的内容还留在那儿。你可以通过在输出的内容后面加上空格,或者使用其他答案中提到的一些控制代码来解决这个问题。

撰写回答