【问题标题】:Why doesn't printing with carriage return \r suppress newline? [duplicate]为什么不使用回车符打印 \r 抑制换行符? [复制]
【发布时间】:2016-10-23 21:47:50
【问题描述】:

我对 Python 很陌生,但我正在尝试做一些我认为非常简单的事情。然而,它已经困扰了我很长一段时间了。

我有一个执行一定次数迭代的代码,我想在同一行打印进度状态。

我尝试了以下

y=1000000
for x in range(y):
    if x % 100000 == 0 and x!=0 or x==y :
        print "  Iteration %d out of %d\r" % (x,y)

但我得到的不是回车而是简单的

  Iteration 100000 out of 1000000
  Iteration 200000 out of 1000000
  Iteration 300000 out of 1000000
  Iteration 400000 out of 1000000
  Iteration 500000 out of 1000000
  ...

在视频中打印出来。

有趣的是,如果我这样做了

for x in range(1000000):
    print "%d\r" % x,

它完成了这项工作。 有人知道为什么吗?

【问题讨论】:

  • print 自动添加换行符。

标签: python printing newline


【解决方案1】:

在 Python 2.x 中

要禁止打印换行符,请添加尾随逗号:

print s ,

所以在这种情况下:

print "  Iteration %d out of %d\r" % (x,y) ,

(提示:为了清楚起见,我总是在结尾的逗号前留一个空格)

在 Python 3.x 中

print x,           # 2.x: Trailing comma suppresses newline
print(x, end="")   # 3.x: Appends a space instead of a newline

【讨论】:

  • 嗨,不幸的是 id 不起作用......我得到的是循环期间终端没有打印,只是最终打印错误,即
  • 0 / 10000000
  • 确实对我有用,我得到 "Iteration 100000 out of 1000000... Iteration 200000 out of 1000000... Iteration 900000 out of 1000000" 看,您询问了在打印中抑制换行符的问题,这就是解决方案。至于为什么您的循环对您的行为不像对我们其他人那样,请检查您的缩进,添加更多打印语句,尝试为条件子表达式加上括号,甚至在需要时打印它们。如果您自己无法解决,请将其作为新问题重新发布,包括您缩进时的确切代码。不看代码就无法诊断。
  • 我明白了。我刚刚报告说它对我不起作用,因为我相信它对于阅读该主题的其他人也可能是有用的信息。代码很简单,我只是用你建议的代码替换上一个代码的最后一行,没什么太复杂的。然而它并没有完成这项工作。对重复的问题感到抱歉,但我相信我应该写下这个解决方案对我不起作用,因为它可能会发生在其他人身上。
  • @dani8586 我遇到了一个类似的问题,就我而言,这是一个缓冲问题。该问题有两种解决方案:使用python -u 以无缓冲模式启动python,或在每次打印后调用sys.stdout.flush();看到so question
【解决方案2】:

除了使用print,你也可以使用

sys.stdout.write("  Iteration %d out of %d\r" % (x,y))

这不会在您编写的内容中添加任何换行符。

【讨论】:

  • 这也不起作用...我在循环过程中没有打印,最后只有 0 出 10000000...
  • 每次调用write后都需要sys.stdout.flush()
  • 当与bash 一起使用时,您可能需要附加\033[K,例如" Iteration %d out of %d\r\033[K",清除该行的其余部分及其上未被最后一个 write 覆盖的任何工件。
【解决方案3】:

这仅适用于 python 3。您可以添加 end="" 这将确保输出打印在同一行上。 print print 会将输出写入控制台的新行。

打印函数接受end 参数,默认为“\n”。将其设置为空字符串可防止它在行尾发出新行。

【讨论】:

  • 这仅适用于 python3。 OP 正在使用 python2。
  • 我的错。我会更新我的答案。 @jadsq
  • 你可以在 Python 2 中使用from __future__ import print_function
  • 在这种情况下相同.. 没有打印输出,最后只有 10000000 中的 0...
猜你喜欢
  • 2023-02-21
  • 2013-01-05
  • 2011-06-18
  • 2020-08-19
  • 1970-01-01
  • 2015-09-28
  • 1970-01-01
  • 1970-01-01
  • 2012-09-05
相关资源
最近更新 更多