移除并替换已打印项目

191 投票
3 回答
353613 浏览
提问于 2025-04-16 13:37

我在想,能不能在Python中删除已经打印出来的内容——不是在Python的图形界面里,而是在命令提示符下。

a = 0  
for x in range (0,3):  
    a = a + 1  
    b = ("Loading" + "." * a)
print (a)

比如,它会打印出:

>>>Loading   
>>>Loading. 
>>>Loading.. 
>>>Loading...

但是,我的问题是我想把这些内容都放在一行上,并且希望当有新的内容出现时,之前的内容能自动消失。所以我不想打印出 "Loading", "Loading.", "Loading...",而是想先打印 "Loading.",然后把这一行的内容去掉,换成 "Loading..",再把 "Loading.."去掉,换成 "Loading..."。这有点难以描述。

补充一下,我试过使用退格符,但似乎没有效果 ("\b")

3 个回答

42
import sys
import time

a = 0  
for x in range (0,3):  
    a = a + 1  
    b = ("Loading" + "." * a)
    # \r prints a carriage return first, so `b` is printed on top of the previous line.
    sys.stdout.write('\r'+b)
    time.sleep(0.5)
print (a)

请注意,根据你使用的控制台,可能需要在 sys.stdout.write('\r'+b) 之后立即运行 sys.stdout.flush(),这样才能确保结果在你请求的时候就被打印出来,而不是被暂时存起来。

145

一种方法是使用 ANSI 转义序列

import sys
import time
for i in range(10):
    print("Loading" + "." * i)
    sys.stdout.write("\033[F") # Cursor up one line
    time.sleep(1)

有时候这也很有用(比如当你打印的内容比之前短的时候):

sys.stdout.write("\033[K") # Clear to the end of line
279

只需使用回车键(CR)就可以回到行的开头。

import time
for x in range (0,5):  
    b = "Loading" + "." * x
    print (b, end="\r")
    time.sleep(1)

撰写回答