移除和替换印刷品[重复]
Posted
技术标签:
【中文标题】移除和替换印刷品[重复]【英文标题】:Remove and Replace Printed items [duplicate] 【发布时间】:2011-07-14 13:01:17 【问题描述】:我想知道是否可以删除您在 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..."
替换它(在同一行) .这有点难以描述。
p.s 我曾尝试使用 Backspace 字符,但它似乎不起作用 ("\b"
)
谢谢
【问题讨论】:
a
变量的意义何在?你可以只使用 x 作为你的变量,它会做同样的事情!
两个问题:1.不应该将print()
命令缩进到for循环内部的级别吗?目前,您的代码不会打印某种进度,而只会打印最终状态。 2.不应该是print (b)
吗?目前只打印整数,而不是问题中提到的"Loading"
。
【参考方案1】:
只需使用 CR 转到行首。
import time
for x in range (0,5):
b = "Loading" + "." * x
print (b, end="\r")
time.sleep(1)
【讨论】:
对终端 (IDLE) 有什么想法吗?sys.stdout.write("\033[K")
清除之前的打印
@h0ussni 我不知道那是什么巫术,但效果很好
sys.stdout.write('\033[2K\033[1G')
擦除并转到行首
旁注:要在 jupyter(python3 中)中进行这项工作,请使用:print("\r", b, end="")
【参考方案2】:
一种方法是使用ANSI escape sequences:
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
【讨论】:
在 python 笔记本中不起作用 :( 是否需要使用 sys.stdout.write() ?你可以只做 print("\033[K",end='') 吗? @Trevor 这个答案是为在 Python 2 和 3 中工作而编写的。我知道这个问题被标记为“python-3.x”,但早在 2011 年几乎没有人使用 Python 3,所以我写了一个适用于两个版本的答案。如果您使用的是 Python 3,如果您愿意,可以使用print(..., end="")
。
如果你想将光标向上移动 2 行,理论上你能做到 sys.stdout.write("\033[F" * 2)
吗?
@madladzen 这应该可以。 ANSI 序列也支持参数,所以你也可以使用sys.stdout.write("\033[2F")
。【参考方案3】:
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()
,具体取决于您正在执行打印的控制台,以便在请求时打印结果而无需任何缓冲。
【讨论】:
这在 pycharm 的控制台中没有持续抖动的情况下工作。 pycharm的控制台中带有end =“”的打印闪烁很多以上是关于移除和替换印刷品[重复]的主要内容,如果未能解决你的问题,请参考以下文章
CATiledLayer 在 iPad 第 3 代放大时被移除和刷新