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

2 投票
2 回答
4375 浏览
提问于 2025-04-18 03:09

我在用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 就可以了。)

撰写回答