使用python打印刷新stdout行的问题

时间:2012-05-11 13:33:45

标签: python python-2.7 stdout

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

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

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

编辑1:

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

为什么没有输出?

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

编辑2:

感谢senderle,这已经解决了。如果你错过了sleep()命令,打印和回车就会很快发生,你看不到它们。

编辑3:

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

编辑4:

请注意senderle的答案中print i之后的逗号。

2 个答案:

答案 0 :(得分:1)

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

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

这是一种WAG。如果有帮助,请告诉我。

我试过这个,它对我有用。 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'

答案 1 :(得分:0)

按原样测试代码,只包括:冒号:在第一行的末尾,与Py2.7 32位,Windows7 64位一样正常。

您是否在iffor块中对stdout进行了写操作,这可能会导致新行被写出来?