覆盖同一行

时间:2016-11-26 22:16:17

标签: python

我希望我的代码输出覆盖同一行的前一个输出。

我已经阅读过类似问题的先前答案,并且已经阅读了我可以使用','和一个' \ r'但这对我来说似乎不起作用。我试过了:

for i in range(length):
    print 'Minutes:',minute,'of {0}'.format(length),'\r',
    minute+=1
    time.sleep(1)

但它不会打印除循环最后一行以外的任何内容。我已经尝试了其他安排,但还没有任何工作。有人能让我知道我做错了吗?

感谢。

5 个答案:

答案 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)

一般提示

  1. 您在同一个print语句中使用逗号和str.format(),而只是使用str.format()表示所有内容。例如print 'Minutes: {0}, of {1}'.format(minute, length)

  2. 您使用minute作为您的计数器,即使它看起来是您按秒计数。为清楚起见,您可能希望重命名该变量second

  3. 注意

    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)