使用python打印刷新标准输出行时出现问题



我一直在尝试使用以下代码打印出python2.7中for循环的进度:

for i in range(100):
    if float(i) % 10.0 == 0:
        print i, "r",

我追求的行为是在 std 上刷新同一行,而不是每次都写入新行。

编辑 1:

在我的控制台(Xfce 终端 0.4.8(中进行测试,无论我是否包含 if 语句,我实际上都不会得到任何输出。

为什么没有输出?

我最初说 stdout 的行为会根据 if 语句是否存在而改变,因为我将产生问题的代码简化为最简单的形式(只是为了产生上述效果(。我道歉。

编辑2:

感谢发件人,这解决了。如果您错过了sleep()命令,打印和回车的速度如此之快,以至于您看不到它们。

编辑3:

最后一件事。如果您没有抓住 range(100) 中的最终数字,即 99,则该数字将从屏幕上清除。

编辑4:

请注意发件人答案中print i后面的逗号。

我发现使用 sys.stdout 是一种更独立于系统的方法,因为 varions 的原因与 print 的工作方式有关。但是你必须显式flush缓冲区,所以我把它放在一个函数中。

def carriage_return():
    sys.stdout.write('r')
    sys.stdout.flush()

这是一种摇摆不定。让我知道它是否有帮助。

试过这个,它对我有用。time.sleep只是为了戏剧化。

import sys, time
def carriage_return():
    sys.stdout.write('r')
    sys.stdout.flush()
for i in range(100):
    if i % 10 == 0:
        print i,
        carriage_return()
        time.sleep(1)

最后,我也看到人们这样做。像这样使用终端控制代码在某些方面似乎是正确的,但对我来说似乎也更脆弱。这也适用于上面的代码(在OS X上(。

def carriage_return():
    if sys.platform.lower().startswith('win'):
        print 'r'
    else:
        print chr(27) + '[A'

原样测试您的代码,只需在第一行末尾包含一个 :冒号:,就可以在 Py2.7 32 位、Windows7 64 位上正常工作。

您是否在iffor块中对 stdout 有任何可能导致写出换行符的输出?

最新更新