[英]Python print to stay on same line
import os
import time
h = 0
s = 0
m = 0
while s <= 60:
os.system('clear')
print h, "hours", m, 'minutes', s, 'seconds'
time.sleep(1)
s += 1
if s == 60:
m += 1
s = 0
elif m == 60:
h += 1
m = 0
s = 0
我上面有這個代碼。 這一切都很好,並做了它的意圖,但我想做它,以便它打印在同一行中的所有語句。 例如,它應該打印出0小時0分0秒,然后在同一行打印出0小時0分1秒,第二個變量是唯一正在改變的東西。 我該怎么做呢? 我已經嘗試過使用os.system('clear')命令,但它不起作用。 我在Mac OSX 10.7上運行它。
您應該使用終端提供的內容。 在大多數情況下,您需要使用'\\r'
(回車,返回到該行的第一列); 但是根據操作系統的不同,可能會對其進行解釋,使其也附加換行符。 我覺得我記得OSX可能會這樣做。
此外,您需要避免自動換行print
將始終追加。 您可以使用尾隨逗號,但這有問題(雜散空間,沒有刷新)。 所以我建議使用sys.stdout.write()
,因為沒有換行通常不會進行刷新,所以你也應該明確地使用sys.stdout.flush()
。
然后,返回第一列將不會刪除舊輸出,因此它只會被下一行覆蓋。 如果它比之前的那個短,你將有尾隨垃圾。 為避免這種情況,請再次使用終端提供的內容(通常'\\x1b[K'
刪除所有內容直到行尾但不移動光標,但如果這對您不起作用,只需打印一些空格或確保輸出格式始終為相同的寬度)。
EL = '\x1b[K' # clear to end of line
CR = '\r' # carriage return
sys.stdout.write(("%d hours %d minutes %s seconds" + EL + CR) % (h, m, s))
sys.stdout.flush()
一個更好的方法(除了這個使用文字序列的快捷方式)是使用官方curses庫。
import curses
curses.setupterm()
EL = curses.tigetstr('el')
CR = curses.tigetstr('cr')
如果CR真的沒有在OSX,因為我們希望它來,那么有可能對你的termcap 轉到去一個特定的位置(例如第一列)或工作,你可以使用save_cursor
(SC)和restore_cursor
(RC)來還原較早保存的位置:
sys.stdout.write(SC + "%d hours %d minutes %s seconds" + EL + RC % (h, m, s))
試試這個:
print h, "hours", m, 'minutes', s, 'seconds', '\r'
你也應該看看阿爾菲的回答:-)
在Python 3中,您可以使用這種代碼:
print("{} hours, {} minutes, {} seconds".format(h, m, s), end = "\r")
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.