簡體   English   中英

Python打印保持同一條線

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM