【python】sys.stdout輸出不換行

在處理程序打進度條時,希望不換行顯示進度,可以使用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

在這裏插入圖片描述
pic from pexels.com

發佈了362 篇原創文章 · 獲贊 327 · 訪問量 60萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章