Python 2.7回车倒计时

时间:2013-07-02 21:37:33

标签: python python-2.7 carriage-return sys

我在使用回车在python中实现简单的倒计时时遇到了麻烦。我有两个版本,每个版本都有问题。

打印版本:

for i in range(10):
    print "\rCountdown: %d" % i
    time.sleep(1)

问题:\r没有做任何事情,因为在最后打印了换行符,因此它给出了输出:

Countdown: 0
Countdown: 1
Countdown: 2
Countdown: 3
Countdown: 4
Countdown: 5
Countdown: 6
Countdown: 7
Countdown: 8
Countdown: 9

Sys.stdout.write版本:

for i in range(10):
    sys.stdout.write("\rCountdown: %d" % i)
    time.sleep(1)
print "\n"

问题:所有睡眠都在开始时发生,在睡眠10秒后,它只会将Countdown: 9打印到屏幕上。我可以看到\r正在幕后工作,但我怎样才能让这些版画穿插在睡眠中?

5 个答案:

答案 0 :(得分:7)

对于解决方案编号2,您需要刷新标准输出。

for i in range(10):
    sys.stdout.write("\rCountdown: %d" % i)
    sys.stdout.flush()
    time.sleep(1)
print ''

此外,只需打印一个空字符串,因为print会附加换行符。或者如果您认为它更具可读性,则使用print '\n' ,,因为尾随逗号会抑制通常会附加的换行符。

虽然不确定如何修复第一个......

答案 1 :(得分:1)

我用

import time
for i in range(0,10):
    print "countdown: ",10-i
    time.sleep(1)    
    print chr(12)#clear screen
print "lift off"

答案 2 :(得分:0)

对于解决方案1(打印版本),在docs中指出,在打印语句的末尾包含逗号将防止在末尾打印换行符。但是,仍然需要按照Brian所述刷新stdout。

for i in range(10):
    print "\rCountdown: %d" % i,
    sys.stdout.flush()
    time.sleep(1)

一种替代方法是使用print function,但仍然需要sys.stdout.flush()

from __future__ import print_function
for i in range(10):
    print("\rCountdown: %d" % i, end="")
    sys.stdout.flush()
    time.sleep(1)

答案 3 :(得分:0)

无人处理:

for i in xrange(10):
    print "COUNTDOWN: %d" %i, time.sleep(1)

# OP
# Countdown: 0 None
# Countdown: 1 None
# Countdown: 2 None
# Countdown: 3 None
# Countdown: 4 None
# Countdown: 5 None
# Countdown: 6 None
# Countdown: 7 None
# Countdown: 8 None
# Countdown: 9 None

答案 4 :(得分:-1)

另一种解决方案:

for i in range(10):
    print "Countdown: %d\r" % i,
    time.sleep(1)