我希望我的代码输出覆盖同一行的前一个输出。
我已经阅读过类似问题的先前答案,并且已经阅读了我可以使用','和一个' \ r'但这对我来说似乎不起作用。我试过了:
for i in range(length):
print 'Minutes:',minute,'of {0}'.format(length),'\r',
minute+=1
time.sleep(1)
但它不会打印除循环最后一行以外的任何内容。我已经尝试了其他安排,但还没有任何工作。有人能让我知道我做错了吗?
感谢。
答案 0 :(得分:1)
您需要sys.stderr才能在屏幕上快速输出:
import sys,time
length,minute = 10,0
for i in range(length):
sys.stderr.write('Minutes:{} of {}\r'.format(minute,length))
minute+=1
time.sleep(1)
不要忘记在循环结束时添加sys.stderr.write('\ n')以避免打印到同一行。
答案 1 :(得分:1)
如果您在Linux中执行此操作,则可以使用ASCII转义序列将光标向上移动一行(\033[1A
)。当然,您仍然会使用\r
移动到行的开头。你可以使用这样的东西:
for i in range(length):
print('Minutes: ' + minutes + '\033[1A\r')
minutes += 1
sleep(1)
答案 2 :(得分:0)
我能想到的最简单的方法是,如果你知道你的shell有多少行,那么你就可以
print "\n" * (number_of_lines - 1)
然后
print 'Minutes:',minute,'of {0}'.format(length)
所以一起,
for i in range(length):
print "\n" * (number_of_lines - 1)
print 'Minutes:',minute,'of {0}'.format(length)
minute += 1
time.sleep(1)
一般提示
您在同一个print语句中使用逗号和str.format()
,而只是使用str.format()
表示所有内容。例如print 'Minutes: {0}, of {1}'.format(minute, length)
。
您使用minute
作为您的计数器,即使它看起来是您按秒计数。为清楚起见,您可能希望重命名该变量second
。
注意强>
sys.stderr
是执行此操作的更好方式。请查看rth的回答
答案 3 :(得分:0)
如果您使用的是Python3
,则可以使用以下代码:
import time
minute, length = 1, 100
for i in range(length):
print ('Minutes: {0} of {1}\r'.format(minute, length), end = "")
minute+=1
time.sleep(1)
但是,如果您使用的是Python2
,则可以从print_function
模块中导入__future__
,如下例所示:
from __future__ import print_function
import time
minute, length = 1, 100
for i in range(length):
print("Minutes: {0} of {1}\r".format(minute, length), end = "")
minute+=1
time.sleep(1)
PS:使用Python2.7.10
从终端运行最后一个代码时出现了一个奇怪的问题。脚本工作但没有任何输出。
但是在Python 2.7.10 interpreter
范围内,代码运行正常。
如果您在Python2
中遇到任何问题,请测试两种解决方案并留下您的反馈。
修改强>
我认为更好的解决方案是避免我遇到的奇怪问题,而且我不知道原因,正如@Fejs在答案中所说的那样使用ASCII转义。
您的代码将是这样的:
import time
minute, length = 1, 100
for i in range(length):
print "Minutes: {0} of {1} {2}".format(minute, length, '\033[1A\r')
minute+=1
time.sleep(1)
答案 4 :(得分:0)
尝试在每次睡眠前刷新输出。
minute+=1
sys.stdout.flush()
time.sleep(1)