移除和更换印刷品

190
我想知道是否有可能从Python命令提示符中删除已经打印的项,而不是从Python GUI中删除。 例如:
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)。

7
这里的变量a有什么意义?你可以直接使用x作为变量,它会完成相同的事情! - John Howard
2
两个问题:1. print()命令不应该缩进到for循环的内部吗? 目前,您的代码没有打印出某种进度,而只有最终状态。2. 不应该是print(b)吗? 目前只打印整数,而不是问题中提到的“加载”。 - Qaswed
3个回答

278

只需使用回车键即可移到行首。

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

7
终端(IDLE)有什么想法吗? - Nouman
39
sys.stdout.write("\033[K") 可以清除先前的输出。 - user2742371
3
我不知道那是什么魔法,但它运作得非常好。 - Dustin Michels
13
sys.stdout.write('\033[2K\033[1G') 意为清除当前行并将光标移至行首。 - sound wave
16
附注:为了在jupyter中(使用Python3)使它工作,请使用:print("\r", b, end="") - DSH
显示剩余4条评论

143

一种方法是使用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

12
无法在Python笔记本中运行 :( - markroxor
7
需要使用sys.stdout.write()吗?你可以尝试这样做:print("\033[K",end='') - Trevor
4
这篇答案是为了在Python 2和3中都能使用而编写的。我知道这个问题被标记为“python-3.x”,但是在2011年,几乎没有人使用Python 3,因此我编写了一个可以在两个版本中都运行的答案。如果你使用的是Python 3,你可以使用print(..., end="")代替。 - Sven Marnach
5
如果你想让光标上移两行,理论上你可以使用sys.stdout.write("\033[F" * 2)这个命令吗? - madladzen
4
可以的。 ANSI序列还支持参数,因此您也可以使用 sys.stdout.write("\033[2F") - Sven Marnach
显示剩余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(),以便在请求时无缓冲地打印结果。


1
这在PyCharm的控制台中可以稳定运行,不会出现持续抖动。使用“end =””参数的打印语句在PyCharm的控制台中会频繁闪烁。 - SATYAJEET RANJAN
在Spyder 5上运行得非常好。 - El_que_no_duda

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接