Python 3.x Python'\r';在同一行上打印,但未打印';不要删除前面的文字

Python 3.x Python'\r';在同一行上打印,但未打印';不要删除前面的文字,python-3.x,terminal,io,jupyter-notebook,Python 3.x,Terminal,Io,Jupyter Notebook,我试图打印每个迭代的报告。由于每次迭代都需要很长时间才能运行,因此,我使用print和end=“\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 {}/

我试图打印每个迭代的报告。由于每次迭代都需要很长时间才能运行,因此,我使用
print
end=“\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终端上运行它时,进度信息并没有完全擦除,结果覆盖在进度之上


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

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

您可以通过打印空格来利用终端的这种行为。您至少需要与要擦除的内容一样多的空格,但不足以使终端换行到下一行(如果该行一直打印到最后一个字符,这可能是不可能的)。

在您的情况下,您知道行的长度不会超过22个字符,因此可以使用
end='\r\r'
(返回行的开头,打印22个空格,然后再次返回行的开头)。

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

您可以通过打印空格来利用终端的这种行为。您至少需要与要擦除的内容一样多的空格,但不足以使终端换行到下一行(如果该行一直打印到最后一个字符,这可能是不可能的)。

在您的情况下,您知道行的长度不会超过22个字符,因此您可以使用
end='\r\r'
(返回行首,打印22个空格,然后再次返回行首)。

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

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

我想如果您想手动清除它,您可以
打印('\r'+'*100+'\r'+'{}\t{:2f}…'。格式(…)
它在哪里说
\r
擦除任何东西?我想如果你想手动清除它,你可以
打印('\r'+'*100+'\r'+'{}\t{:2f}…'.format(…)
它在哪里说
\r
擦除任何东西?谢谢你解释
\r
的行为。我99%的时间都在使用jupyter笔记本,而且它总是会自动用
\r
删除以前的文本。所以我一直假设
\r
也会删除以前打印的文本。感谢您解释
\r
的行为。我99%的时间都在使用jupyter笔记本,而且它总是会自动用
\r
删除以前的文本。所以我一直假设
\r
也会删除以前打印的文本。