在Python中清除sys.stdout中的旧数据

时间:2014-04-17 16:17:18

标签: python

在Python中写入sys.stdout时我没有得到的东西。我想要的是将一些字符串写入stdout而不预先渲染之前已经写过的东西。

这样做:

 while True:

    sys.stdout.write("k")
    sys.stdout.flush()

 sys.stdout.write("d")

在循环中将一些“k”数据写入stdout之后,我需要在之后写入一些新数据,为了示例,这是“d”。 我得到了:输出中的“k d”。循环写入中的“K”仍在stdout中。

我想要的只是“d”。

为什么呢? 如何在将新数据写入之前清除标准输出?

顺便说一句,使用print()代替仍然将旧数据累积到最终输出中。

在Linux上使用python 2.7

2 个答案:

答案 0 :(得分:2)

终端无法正常工作。 flush只是刷新缓冲区(即可能尚未打印到屏幕上的字符),它不会清除屏幕。

如果要删除一个字符,则需要打印一个文字退格控制字符,然后在上打印上面的输出(如空格):

sys.stdout.write("\b ")

然而。你的这个问题掩盖了对终端如何工作的深刻误解。可以把它想象成一个文本处理器 - 屏幕上有文本,还有一个光标(不可见)。您需要告诉光标如何操作屏幕上的文本。由于光标始终处于覆盖模式,因此通常有用的技巧是返回到行的开头:

 sys.stdout.write("\r")

并覆盖该行的数据。请注意,如果您的新数据的长度小于之前的数据,则会在屏幕上留下一些以前的数据。

如果这些都不适合您的账单,可以使用其他技巧,例如将terminal control sequences输出到标准输出。

(另外,除非您特别需要使用sys.stdout,否则只需使用print。)

答案 1 :(得分:0)

  

我必须打印" k"但在" d"之前有一行。我想打印" d"在一个全新的路线。

只需在两者之间写一个换行符:

sys.stdout.write("\n")

或者只使用print,在最后添加隐式换行符:

print "k"
print "d"