删除并替换打印的项目

Ale*_*ex 85 python printing python-3.x python-3.2

我想知道是否有可能删除你用Python打印的项目 - 不是从Python GUI,而是从命令提示符.例如

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

所以它打印

>>>Loading   
>>>Loading. 
>>>Loading.. 
>>>Loading...
Run Code Online (Sandbox Code Playgroud)

但是,我的问题是我希望这一切都在一条线上,为此它会在其他东西出现时自行删除它.因此,不是打印"Loading", "Loading.", "Loading...我希望它打印"Loading.",然后它删除行上的内容并替换它,"Loading.."然后删除"Loading.."并替换它(在同一行)"Loading...".这很难描述.

ps我试图使用Backspace字符,但它似乎不起作用("\b")

谢谢

Kei*_*ith 135

只需使用CR即可开始行.

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

  • `sys.stdout.write("\ 033 [K")`清除以前的打印 (10认同)
  • 旁注:要在 jupyter 中(在 python3 中)实现此功能,请使用: `print("\r", b, end="")` (10认同)
  • 对终端 _( IDLE )_ 有什么想法吗? (3认同)
  • @h0ussni 我不知道那是巫术,但效果很好 (3认同)
  • sys.stdout.write('\ 033 [2K \ 033 [1G'))删除并转到行首 (2认同)
  • 而不是“”。* x`,你应该尝试“”。* (x % 3 + 1)` 以避免诸如“正在加载……”之类的内容 (2认同)

Sve*_*ach 98

一种方法是使用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)
Run Code Online (Sandbox Code Playgroud)

有时也很有用(例如,如果你打印比以前更短的东西):

sys.stdout.write("\033[K") # Clear to the end of line
Run Code Online (Sandbox Code Playgroud)

  • 是否有必要使用sys.stdout.write()?你能做print(“ \ 033 [K”,end ='')吗? (3认同)
  • 在python笔记本中不起作用:( (2认同)
  • @Trevor 这个答案是为 Python 2 和 3 编写的。我知道这个问题被标记为“python-3.x”,但在 2011 年几乎没有人使用 Python 3,所以我写了一个在两个版本中都适用的答案. 如果您使用的是 Python 3,您可以根据需要使用 `print(..., end="")`。 (2认同)
  • 如果你想将光标向上移动 2 行,理论上你可以执行 `sys.stdout.write("\033[F" * 2)` 吗? (2认同)
  • @madladzen 这应该有效。ANSI 序列还支持参数,因此您也可以使用 `sys.stdout.write("\033[2F")`。 (2认同)

unu*_*tbu 21

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)
Run Code Online (Sandbox Code Playgroud)

请注意,您可能必须立即运行sys.stdout.flush(),sys.stdout.write('\r'+b)具体取决于您正在执行打印的控制台,以便在请求时打印结果而不进行任何缓冲.