Python'\ r'在同一行上打印,但不会删除先前的文本

时间:2019-09-28 06:12:08

标签: python-3.x terminal io jupyter-notebook

我正在尝试为每次迭代打印报告。由于每次迭代都需要很长时间才能运行,因此,我将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)) 

预期结果

enter image description here 这是我的预期结果,每次迭代后进度信息都会被完全擦除。 (我正在Jupyter笔记本中运行它,看起来还不错)

我得到的结果

enter image description here 但是,当我在linux终端上运行它时,进度信息并未完全删除,结果覆盖在进度之上。

为什么会这样?如何解决?

2 个答案:

答案 0 :(得分:1)

\r只是将光标移回当前行的开头。在\r之后“之前”的内容“顶部”上打印的所有内容。在真正的打印机/电传打字机上,这实际上是正确的,两个字符被打印在同一位置(“超量打印”)。在终端上,新字符替换了旧字符(但仅在您实际写入的位置)。

您可以通过打印空格来利用终端的这种行为。您至少需要与要擦除的内容一样多的空格,但不足以使终端换行到下一行(如果将行一直打印到最后一个字符,这可能是不可能的)。
在您的情况下,您知道该行的长度不会超过22个字符,因此可以使用end='\r \r'(返回到该行的开头,打印22个空格,然后返回到该行的开头再行)。

答案 1 :(得分:0)

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