在 Python 中,您可以使用
\r
在同一行上打印以移回行首。
这对于进度条或增加百分比计数器非常有效,例如:Python 在同一行打印
但是,当打印长度可能会减少的行时,这会将前几行文本保留在那里,例如:
import sys
for t in ['long line', '%']:
sys.stdout.write(t + '\r')
sys.stdout.write('\n')
将终端文本保留为:
%ong line
。
打印到同一行时,在较长的行之后写较短的行的最佳方法是什么?
与
\r
一起,还需要反序列 \033[K
- 擦除到行尾。
此代码按预期工作。
import sys
for t in ['long line', '%']:
sys.stdout.write('\033[K' + t + '\r')
sys.stdout.write('\n')
注意,当字符串包含制表符时,这不起作用,您可能需要替换:
sys.stdout.write('\033[K' + t + '\r')
与...
sys.stdout.write('\033[K' + t.expandtabs(2) + '\r')
如果您在打印末尾没有换行符进行打印,您可以使用以下命令刷新最新的打印内容:
print('\r\033[K', end='')
如果您之前打印了新行,则可以使用 ANSI 转义码向上移动一行并移动到行首:
print('\033[F', end='')
然后您可以像以前一样冲洗管线。
用法示例:
LINE_FLUSH = '\r\033[K'
UP_FRONT_LINE = '\033[F'
...
print(UP_FRONT_LINE + LINE_FLUSH + msg)
我认为最简单的方法是在字符上写空格。为此,最好编写足够多的空格来覆盖最后一行。 示例:
previousLength = 0
for t in ["long line", "%"]:
print(" " * previousLength, end="\r")
print(t, end="\r")
previousLength = len(t)
print("\n")
从技术上讲,此解决方案不会清除先前打印语句的输出, 但这只是实现您的目标的一种解决方法,即在较长的行之后编写较短的行,而不需要前一行多余的字符。
@M Palmer's 答案的缩短版本。
我们可以只打印
space
字符来擦除之前的输出,这可以使用 ljust
字符串方法来完成。
print('long line', end="\r")
print('%'.ljust(10))
输出:
%
更通用的方法可以是保存程序中最大字符串的长度并将该长度传递给
ljust
方法
但是
\033[K
效果最好。