Python“\r”打印在同一行上,但不会擦除前面的文本

qxgroojn  于 2023-03-20  发布在  Python
关注(0)|答案(3)|浏览(262)

我尝试打印每个迭代的报告,由于每个迭代都需要很长时间,因此,我使用printend="\r"来显示当前正在处理的项目,下面是虚拟代码:

import time
y = list(range(50))

print("epoch\ttrain loss\ttest loss\ttrain avg\ttest avg\ttime\tutime")
for e in range(10):
    for i in range(50):
        print("training {}/{} batches".format(i,50), end = '\r')
        time.sleep(0.05)
    print('{}\t{:2f}\t{:2f}\t{:2f}\t{:2f}\t{:2.1f}\t{:2.1f}'.format(y[0]+e,y[1]+e,y[2]+e,y[3]+e,y[4]+e,y[5]+e,y[6]+e))

预期结果


这是我预期的结果,在每次迭代后进度信息都被完全擦除(我正在Jupyter笔记本中运行,看起来很好)

我得到的结果


但是,当我在linux终端上运行它时,进度信息并没有完全擦除,结果覆盖在进度之上。
为什么会这样?如何解决?

5cg8jx4n

5cg8jx4n1#

\r只是将光标移回到当前行的开头。在\r之后打印的任何内容都打印在前面的内容的”顶部“。在真实的的打印机/电传打字机上,这是字面上的真实情况,两个字符打印在同一位置(“overstrike”)。在终端上,新字符替换旧字符(但仅在您实际写入的位置)。
您可以通过打印空格来利用终端的这种行为。您需要的空格至少与要擦除的内容一样多,但不足以使终端换行到下一行(如果该行一直打印到最后一个字符,这可能是不可能的)。
在您的示例中,您知道该行的长度不会超过22个字符,因此可以使用end='\r \r'(返回到该行的开头,打印22个空白,然后再次返回到该行的开头)。

whhtz7ly

whhtz7ly2#

\r选项会将光标设置(移动)为开始,但不会清除文本,您必须确保您打印的数据有足够的空间覆盖以前打印的数据或长度相同,因为仅仅移动到同一行不会自动清除以前的内容。

vnzz0bqm

vnzz0bqm3#

您可以在打印开始处添加“\033[K”以清除所有以前的文本
示例:

print("\033[K" + "abcdfg", end="\r")
print("\033[K" + "abcd", end="\r")

输出:

abcd

如果你打印了什么,光标会放在“a”之前,然后它会取代a
示例:

print("hi")

输出:

hicd

我希望它能解决一些人的问题:)因为这是一个4岁的职位。哈哈。
日安

相关问题