Python print - 如何在 print end="\r" 之前清除输出

Posted

技术标签:

【中文标题】Python print - 如何在 print end="\\r" 之前清除输出【英文标题】:Python print - how to clear output before print end="\r"Python print - 如何在 print end="\r" 之前清除输出 【发布时间】:2020-07-28 03:10:49 【问题描述】:

通常print ("".foo, end="\r") 效果很好。

但例外情况是foo 很长,而下次foo 变短。输出不正确。下面是一个例子:

import time
print ("".format(1111), end="\r")
time.sleep(2)
print ("".format(2), end="\r")

第一个输出:

1111

最终输出(2 秒后)- 错误

2111

预期输出

2

尝试

尝试将flush=Trueprintsys.stdout.flush() 一起使用,但没有成功。

在 Jupyter Notebook 和 iPython 中测试。 知道如何以简单的方式优化它吗?

【问题讨论】:

好吧,我得到了想要的输出:1111,然后在 2 秒后,2 2 秒后我只收到21111 没有出现。 我相信这种行为是依赖于平台的(甚至可能在同一平台上的不同终端之间有所不同)。一种通用的方法是用空格右填充较短的输出。 我在 Windows 上测试了这个。我从下面的答案中知道的是 - 输出适合 Mac。 【参考方案1】:

如果可行就试试这个

import time
print (":<5".format(1111), end="\r")
time.sleep(2)
print (":<5".format(2), end="\r")

【讨论】:

你可以用shutil.get_terminal_size().columns替换5,根据***.com/questions/566746/…应该是跨平台的。 这是迄今为止最好的答案。将其标记为答案。【参考方案2】:

您可以使用类实例来记住最后打印的内容并用空格覆盖它:

import time

class OverwriteLast:
    def __init__(self):
        self.last = 0
    def print(self,s):
        if self.last:
            print(' '*self.last, end='\r')
        self.last = len(s)
        print(s, end='\r')

over = OverwriteLast()

over.print("".format(1111))
time.sleep(2)
over.print ("".format(2))

按要求输出

【讨论】:

正确的方法,它的工作原理。我将再等 1 天,看看是否会有更简单的答案。非常感谢这个解决方案。

以上是关于Python print - 如何在 print end="\r" 之前清除输出的主要内容,如果未能解决你的问题,请参考以下文章

如何在Python中让两个print函数的输出打印在一行内

如何在 Python2 中将所有:print "string" 替换为: print("string"),对于 Python3? [复制]

如何在Python中让两个print函数的输出打印在一行内

python里面如何将print输出的那个值赋值给变量?

python print() 在同时调用时如何实际工作?

Python print - 如何在 print end="\r" 之前清除输出