在Python中清除sys.stdout中的旧数据
我在用Python写东西到sys.stdout的时候,有些地方不太明白。我想把一些字符串写入标准输出,但不想在它前面加上之前已经写过的内容。
比如这样做:
while True:
sys.stdout.write("k")
sys.stdout.flush()
sys.stdout.write("d")
在一个循环中,我已经写了一些“k”数据到标准输出,然后我需要在后面写一些新的数据,假设是“d”。结果我看到的输出是:“k d”。也就是说,循环中写的“K”依然在标准输出里。
我想要的结果只是“d”。
为什么会这样呢?我该怎么在写新数据之前清空标准输出呢?
顺便说一下,使用print()函数也会把旧的数据加到最后的输出里。
我是在Linux上用Python 2.7。
2 个回答
0
我需要在"d"之前打印"k",但是要在新的一行上打印"d"。
只需在两者之间加一个换行符:
sys.stdout.write("\n")
或者直接使用print
,它会在最后自动加一个换行:
print "k"
print "d"
4
终端不是这样工作的。flush
只是清空了一个叫做 缓冲区 的东西(也就是那些可能还没显示到屏幕上的字符),并不会清空屏幕。
如果你想删除一个字符,你需要打印一个实际的退格控制字符,然后在你之前的输出上再打印一些东西 覆盖 过去的内容(比如一个空格):
sys.stdout.write("\b ")
不过,你问这个问题其实反映了你对终端工作原理的误解。可以把它想象成一个文本处理器——屏幕上有文本,还有一个光标(光标是看不见的)。你需要告诉光标该怎么做,以便操作屏幕上的文本。因为光标总是处于覆盖模式,所以一个常用的小技巧是回到行的开头:
sys.stdout.write("\r")
然后在那一行上覆盖你的数据。注意,如果你新打印的数据比之前的数据短,那么屏幕上会留下之前的一些数据。
如果这两种方法都不适合你,还有其他一些技巧可以使用,比如输出一些 终端控制序列 到标准输出。
(另外,除非你有特别的需求去使用 sys.stdout
,否则直接使用 print
就可以了。)