2016-11-26 43 views
0

我想讓我的代碼的輸出覆蓋同一行上的前一個輸出。覆蓋同一行上的前一個輸出

我已經閱讀了以前對類似問題的回答,並且已經閱讀過,我可以使用','和'\ r'來做到這一點,但這似乎不適用於我。我試過了:

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

但它不打印循環的最後一行以外的任何東西。我嘗試了其他安排,但還沒有成功。有人能讓我知道我做錯了什麼嗎?

謝謝。

+0

不需要特殊的字符串格式;你可以做'......分鐘','長度......'。 – TigerhawkT3

回答

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. 您可以使用逗號,並在同一個打印語句str.format(),而不是隻用str.format()對於這一切。例如print 'Minutes: {0}, of {1}'.format(minute, length)

  2. 您使用minute作爲您的計數器,即使它看起來像是以秒計算。爲了清晰起見,您可能想要重命名該變量second


注意

sys.stderr是做到這一點的更好方式。請看看RTH的回答

+0

固定。謝謝 – Signal

+0

我確實相信這個答案很具誤導性。通過一堆空行滾動屏幕,而不是使用標準stderr是非常糟糕的解決方案。如果我想在屏幕上保留以前的所有信息怎麼辦?說例如我的代碼檢查一些選項,其中一些需要幾個循環...我想保持所有的確定在屏幕上,只是表明過程進展順利! – rth

+0

這顯然不是最好的解決方案,但是它是一種不同的解決方案。 – Signal

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

如果您在Linux中執行此操作,您可以簡單地使用ASCII轉義序列將光標向上移動一行(\033[1A)。當然,您仍然會使用\r移動到行首。你可以使用這樣的事情:

for i in range(length): 
    print('Minutes: ' + minutes + '\033[1A\r') 
    minutes += 1 
    sleep(1) 
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:我有一個ST使用Python2.7.10運行我的終端中的最後一個代碼時出現範圍問題。腳本工作,但沒有任何輸出。

但是,在Python 2.7.10 interpreter代碼工作正常。

如果您在Python2內遇到任何問題,請同時測試兩種解決方案並留下您的反饋。

編輯:

我認爲更好的解決方案,以避免奇怪的問題,我遇到了,我不知道原因,是使用ASCII轉義爲@Fejs他回答說。

您的代碼將是這樣的:

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) 
0

儘量沖洗每次睡覺前的輸出。

minute+=1 
sys.stdout.flush() 
time.sleep(1)