代码之家  ›  专栏  ›  技术社区  ›  Raven Cheuk

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

  •  -1
  • Raven Cheuk  · 技术社区  · 6 年前

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

    预期结果

    enter image description here 这是我的预期结果,每次迭代后,进度信息都会被完全删除。(我在Jupyter笔记本上运行,看起来很好)

    我得到的结果

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

    为什么会这样?怎么解决?

    2 回复  |  直到 6 年前
        1
  •  1
  •   hobbs    6 年前

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

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

        2
  •  0
  •   Trenton McKinney ivirshup    6 年前

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