我一直在尝试使用以下代码在 python2.7 中打印出 for 循环的进度:
for i in range(100):
if float(i) % 10.0 == 0:
print i, "\r",
我追求的行为是刷新 std out 上的同一行,而不是每次都写入一个新行。
编辑 1:
在我的控制台(Xfce 终端 0.4.8)中进行测试,无论是否包含 if 语句,我实际上都没有得到任何输出。
为什么没有输出?
我最初说 stdout 的行为根据 if 语句是否存在而改变,因为我将产生问题的代码简化为最简单的形式(只是为了产生上述效果)。抱歉。
编辑 2:
感谢senderle ,这就解决了。如果您错过了 sleep() 命令,打印和回车会发生得如此之快以至于您看不到它们。
编辑 3:
最后一件事。如果您没有找到 range(100) 中的最后一个数字,即 99,该数字将从屏幕上清除。
编辑 4:
注意 senderle 中 print i 后面的逗号的答案。
请您参考如下方法:
我发现使用 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'
