如何在使用\r打印文本后清除控制台中的一行?

6 投票
2 回答
6819 浏览
提问于 2025-04-18 16:05

在我现在的项目中,有一些代码运行得很慢,我也没办法让它们更快。为了了解一下进展情况,我写了一个进度的小代码片段,下面可以看到。

当你看到最后一行时

sys.stdout.write("\r100%" + " "*80 + "\n")

我用 " "*80 来覆盖可能剩下的字符。有没有更好的方法来清空这一行呢?

(如果你能找到剩余时间计算中的错误,我也会很高兴。不过这就是我想问的问题。)

进度代码片段

#!/usr/bin/env python

import time
import sys
import datetime


def some_slow_function():
    start_time = time.time()
    totalwork = 100
    for i in range(totalwork):
        # The slow part
        time.sleep(0.05)
        if i > 0:
            # Show how much work was done / how much work is remaining
            percentage_done = float(i)/totalwork
            current_running_time = time.time() - start_time
            remaining_seconds = current_running_time / percentage_done
            tmp = datetime.timedelta(seconds=remaining_seconds)
            sys.stdout.write("\r%0.2f%% (%s remaining)   " %
                             (percentage_done*100, str(tmp)))
            sys.stdout.flush()
    sys.stdout.write("\r100%" + " "*80 + "\n")
    sys.stdout.flush()

if __name__ == '__main__':
    some_slow_function()

控制台

我大部分时间使用 ZSH,有时用 bash(而且我一直在使用 Linux 系统)

2 个回答

0

这是我使用的内容

from msvcrt import putch, getch

def putvalue(value):
   for c in str(value):
      putch(c)

def overwrite(value):
   """ Used to overwrite the current line in the command prompt,
   useful when displaying percent or progress """
   putvalue('\r'+str(value))

from time import sleep


for x in xrange(101):
   overwrite("Testing Overwrite.........%s%% complete" % x)
   sleep(.05)
13

试试使用ANSI/vt100的“清除到行尾”的转义序列:

sys.stdout.write("\r100%\033[K\n")

示例:

for i in range(4):
    sys.stdout.write("\r" + ("."*i*10))
    sys.stdout.flush()
    if i == 3:
        sys.stdout.write("\rDone\033[K\n")
    time.sleep(1.5)

参考链接: https://en.wikipedia.org/wiki/ANSI_escape_code#CSI_sequences

撰写回答