2

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

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

我所追求的行为是在标准输出上刷新同一行,而不是每次都写入新行。

编辑1:

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

为什么没有输出?

我最初说标准输出的行为取决于是否存在 if 语句,因为我将产生问题的代码简化为最简单的形式(仅产生上述效果)。我很抱歉。

编辑2:

感谢senderle,这已经解决了。如果您错过了sleep()命令,打印和回车会发生得太快,以至于您看不到它们。

编辑 3:

最后一件事。如果您没有找到 中的最后一个数字range(100),即 99,则该数字会从屏幕上清除。

编辑4:

注意senderle的答案后面print i的逗号。

4

2 回答 2

1

我发现 usingsys.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'
于 2012-05-11T13:50:44.680 回答
0

按原样测试您的代码,并且只在第一行的末尾包含一个 :colon: ,在 Py2.7 32 位、Windows7 64 位上工作得很好。

您的iforfor块中是否有任何对标准输出的输出写入可能导致新行被写出?

于 2012-05-11T13:43:39.757 回答