我实际上如何擦除 python 中的打印行

How do i actually wipe a printed line in python

我有一个打印功能,每秒打印一行,并且每次都更新。在大多数情况下 ...end="\r" 完成了工作,但由于某种原因它并没有真正删除前一行,它只是重叠它,这意味着前一行的结尾有时会永久地伸出来,使其不可读和刺耳看看。

我的函数如下所示:

import time

def example():
    #some code setting up stuff
    while True:
        print("some calculation i'm too lazy to actually reproduce", end="\r")
        time.sleep(1)

我一直在寻找,到目前为止我找不到解决方案,甚至找不到和我有同样问题的人,而且我厌倦了看到后面印有四个 s 的行。

编辑:在我的实际代码中,在 print 语句中使用变化的变量进行了实际计算,此示例只是我代码的简化版本。

我不能用 flush=True 来做这个吗?或者那个也能做一些完全不同的事情吗?

您可以打印与 'replace' 之前的内容相等数量的空格:

import time

message = "some calculation i'm too lazy to actually reproduce"
print(message, end="\r")
time.sleep(1)
print(' ' * len(message), end='')

'\r'是马车return;它将指针移回行首,但不包含换行符。所以当一个 print 语句以 '\r' 结束时,下一个 print 语句将与之前的语句打印在同一行,但如果第一行更长,那么多余的字母将保留在最后而不是被覆盖。如果你真的想摆脱这些多余的字母,你可以只用空格填充第二行,直到它和前一行一样长:

text_for_first_line = "some longer string"
text_for_second_line = "some string"
for _ in range(len(text_for_first_line) - len(text_for_second_line)):
    text_for_second_line += " "

这是我的方法,仍然是覆盖,但更彻底

import time

def example():
    previous_line_len = 0
    while True:
        text_to_print = "some calculation i'm too lazy to actually reproduce"
        print(text_to_print + " "*(previous_line_len-len(text_to_print)), end="\r")
        previous_line_len = len(text_to_print)
        time.sleep(1)

这只是添加空格以覆盖上一行

您可以将输出的长度存储到一个变量中 并用它来填充空格。

# Example to demonstrate
import time

def example():
    #some code setting up stuff
    longText = "qwertyuiopasdfghjklzxcvbnm"
    
    #initially set the length of output to 0
    lenVar = 0

    while True:

        toPrint = "some calculation i'm too lazy to actually reproduce! "+longText

        #pad spaces if necessary
        toPrint+=" " * (0 if lenVar<=len(toPrint) else lenVar-len(toPrint))
        print(toPrint, end="\r")
        
        # store the length of output in a variable
        lenVar = len(toPrint)

        # decrease the longText!
        longText = longText[:-1]

        time.sleep(1)

您还可以在要打印的行中添加空格,它会与前一行重叠而不添加如下字母:

import time

def example():
    #some code setting up stuff
    while True:
        print("some calculation i'm too lazy to actually reproduce  ", end="\r") # added spaces here
        time.sleep(1)