在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
答案 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"