在處理程序打進度條時,希望不換行顯示進度,可以使用sys.stdout相關函數來進行處理。
1.print 輸出不換行
首先可以使用print函數來整體輸入,利用,
結尾就可以在同一行內顯示:
# python=2.7,py3.x print要加括號
for i in range(10):
print i,
>>> 0 1 2 3 4 5 6 7 8 9
但是這種方法只能在一行裏連續輸出,並且只能在換行時候才顯示出來。
2.sys.stdout進行實時顯示
爲了進行實時顯示,我們需要利用sys.stdout來實現。
import sys
for i in range(10):
sys.stdout.write(str(i))
sys.stdout.flush()
# 輸出連續的字符
>>> 0123456789
# 可以利用這個做一個進度條:
sys.stdout.write('Processing>>>')
for i in range(10):
sys.stdout.write('*')
sys.stdout.flush()
>>> Processing>>>**********
但是這種方法輸出的是不斷累加的,進度條會不斷增加。如果想要輸出百分數不斷刷新精度就需要利用額外的方法了。
3.回車或退格符的使用
stdout.write
將需要寫的內容放到緩存裏,而後flush
來進行刷新。爲了不換行不疊加的顯示前文的信息,我們可以利用\r
將光標移到行首,然後將前面的輸出覆蓋即可顯示新的內容:
for i in range(10):
sys.stdout.write(str(i)+'\r')
sys.stdout.flush()
time.sleep(0.5)
# 將依次輸出0~9十個數字
>>> 9
# 我們可以輸出對應的百分數進度
for i in range(10):
sys.stdout.write(str(i+1/1*10)+'%\r')
sys.stdout.flush()
time.sleep(0.5)
# 將依次輸出10%~100%
>>> %100
# 稍微改造一下就是很好看的進度條
for i in range(10):
bar_str = i * '>'
sys.stdout.write(str((i+1)/1*10)+'%' + bar_str + '\r')
sys.stdout.flush()
time.sleep(0.5)
# 可以直接copy上面的代碼就可以輸出下面的進度條樣式,在同一行中刷新百分數,延長進度符號
>>> 100%>>>>>>>>>
除了使用\r
外,還可以使用退格符號\b
在進度條後進行刷新:
for i in range(10):
sys.stdout.write('*->'+ '\b\b') #爲了不斷加長中間的*,需要先將->刪除再寫入
sys.stdout.flush()
time.sleep(0.5)
# 帶箭頭的進度條
>>> **********->
# 最後把百分數也加上
for i in range(10):
bar_str = i * '*' + '->'
sys.stdout.write(str((i+1)/1*10)+'%' + bar_str + '\b\b\r')
sys.stdout.flush()
time.sleep(0.5)
# 刷新百分數和逐漸增長的進度條:
>>> 100%*********->
ref:
行內刷新:https://blog.csdn.net/weixin_30390075/article/details/98666769
行首,退格:https://www.jb51.net/article/55413.htm
sys.stdout:https://www.zhihu.com/question/48911955
https://blog.csdn.net/wuguangbin1230/article/details/77680058