我实际上如何擦除 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)
我有一个打印功能,每秒打印一行,并且每次都更新。在大多数情况下 ...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)