【问题标题】:Python '\r' print on the same line but won't erase the previous textPython '\r' 在同一行打印,但不会删除前面的文本
【发布时间】:2019-09-28 06:12:08
【问题描述】:

我正在尝试打印每次迭代的报告。由于每次迭代都需要很长时间才能运行,因此,我使用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 notebook 中运行,看起来不错)

我得到的结果

但是,当我在linux终端上运行它时,进度信息并没有完全擦除,结果是覆盖在进度之上。

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

【问题讨论】:

  • 我想如果你想手动清除它,你可以print('\r' + ' '*100 + '\r' + '{}\t{:2f} ... '.format(...))
  • 哪里说\r 删除了任何东西?

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


【解决方案1】:

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

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

【讨论】:

  • 感谢您解释 \r 的行为。我 99% 的时间都在使用 jupyter notebook,它总是会自动删除带有 \r 的以前的文本。所以我一直假设\r 也会删除以前打印的文本。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2017-12-29
    • 1970-01-01
    • 1970-01-01
    • 2023-03-17
    • 2012-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-04
    相关资源
    最近更新 更多