【问题标题】:How can I use \r to make Python print on the same line?如何使用 \r 使 Python 在同一行打印?
【发布时间】:2014-03-21 17:11:10
【问题描述】:

有人能详细解释一下'\r'在Python中是如何工作的吗? 为什么下面的代码没有在屏幕上打印出任何内容?

#!/usr/bin/python

from time import sleep

for x in range(10000):
    print "%d\r" % x,
    sleep(1)

【问题讨论】:

  • \r(换行)类似于 '\n'(回车)
  • 什么平台?不同的控制台和终端对\r的处理方式不同;这是一个回车,但某些控制台也可能清除该行。

标签: python newline carriage-return


【解决方案1】:

您的输出正在缓冲中,因此不会立即显示。到时候,它已经被 shell 或解释器提示符破坏了。

通过每次打印时冲洗来解决此问题:

#!/usr/bin/python

from time import sleep
import sys

for x in range(10000):
    print "%d\r" % x,
    sys.stdout.flush()
    sleep(1)

【讨论】:

  • 原谅我的无知,什么是潮红?
  • 为了提高性能,输出经常被缓冲。这意味着它会存储在内存中,直到缓冲区已满或被刷新(实际上发送到输出)。 \n 通常会隐式刷新缓冲区,但您不会打印缓冲区。所以你需要请求一个明确的刷新。
  • 另外,我不太确定打印语句后的 '\r' 和逗号如何工作。你能解释一下吗?
  • \r 是一个回车符。正如其他人所说,它的行为取决于您使用的终端类型。但是许多(也许是大多数)会将光标移动到当前行的开头而不创建新行。 Python 的 print 语句通常在其输出的末尾放置一个换行符,但尾随的逗号会抑制这一点。
【解决方案2】:

'\r' 只是另一个 ASCII 码字符。根据定义,它是 CR 或回车。正在使用的终端或控制台将决定如何解释它。 Windows 和 DOS 系统通常期望每行以 CR/LF ('\r\n') 结尾,而 Linux 系统通常只是 LF ('\n'),经典 Mac 只是 CR ('\r');但即使在这些单独的系统上,您通常也可以告诉您的终端仿真器如何解释 CR 和 LF 字符。

从历史上看(就像打字机一样),LF 将光标移到下一行,而 CR 将其带回第一列。

要回答为什么什么都没有打印的问题:删除打印行末尾的逗号。

【讨论】:

  • 你把它们弄反了。 \n 是换行,\r 是回车。
  • 谢谢@Jim,这就是我的第一行和 CR/LF 部分所说的,然后我打错了。
【解决方案3】:

改为这样做:

print "\r%d" % x,

【讨论】:

    【解决方案4】:

    这与\r 无关。问题是print 语句中的尾随,。它试图打印行上的最后一个值,, 正在创建一个最后一个值为空的元组。丢失,,它将按预期工作。

    编辑:

    我不确定说它正在创建一个元组实际上是否正确,但无论哪种方式,这都是问题的根源。

    【讨论】:

    • 现在分行打印。
    • \r 的解释超出了 Python 的范围。你的终端模拟器决定做什么。如果您尝试覆盖同一行,并且看到多行,那就是您的终端在工作。如果你想以跨终端的方式覆盖同一行,你需要使用curses library。
    • \r 如果我在每次打印后添加一个刷新,尾随逗号对我来说效果很好。
    • , 在 Python 2.x 中 print 语句的末尾会跳过 \n,否则会隐式打印。
    猜你喜欢
    • 2013-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多