我一直在尝试使用以下代码在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
之后的逗号。
答案 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位一样正常。
您是否在if
或for
块中对stdout进行了写操作,这可能会导致新行被写出来?