很多時候執行時間較長的指令碼的時候,需要在指令碼裡寫入print(),在控制台列印任務日誌。這種方法雖然寫起來方便,但是實際並不好用,要麼瘋狂刷屏,要麼半天列印一條,時間不好把控,為此我寫了個進度條小工具,呼叫方便,可實現實時重新整理進度百分比,動作條視覺化進度百分比,估計剩餘時間,列印日誌,效果極度優雅!
基本效果如下:
執行中:
執行完:
**如下:
import time
def _show_time(sec, mode=1, fill_zero=false):
# 內部函式,將秒轉換成文字
t=.get(int(mode), ':'),
'um': .get(int(mode), ':'),
'us': .get(int(mode), ''),
}if fill_zero or int(mode)==1:
# 用0補齊
if t['h']>0 or int(mode)==1:
return ''.format(**t)
else:
if t['m']>0:
return ''.format(**t)
else:
return ''.format(**t)
else:
# 不用0補齊
if t['h']>0:
return ''.format(**t)
else:
if t['m']>0:
return ''.format(**t)
else:
return ''.format(**t)
class processbar:
def __init__(self, n, name='', len_bar=50, flush_freq=10000):
'''# 初始化進度條
:param n: 總步數
:param name: 任務名稱
:param bar_len: 進度條長度
:param flush_freq: 重新整理頻次
'''self.n = n # 任務總長度
self.mission_nm = name # 任務名稱
self.len_bar = len_bar # 進度條長度
self.n = 0 # 當前任務進度
self.step_flush = max(n//flush_freq, 1) # 重新整理次數步長
self.start_time = time.time() # 任務初始化時間
self.trigger = true # 任務初始化開關
self.s_bar_f = chr(9608) # 動作條字元(已完成)
self.s_bar_n = chr(9617) # 動作條字元(未完成)
def go(self, text=''):
'''# 直接列印當前進度,百分比以及估計的剩餘時間
:param text: # 需要在顯示器列印的資訊
:return: none
'''self._refresh()
if text:
print('\r' + text, flush=true)
if self.n % self.step_flush==0:
# 確定是否重新整理進度條
print('\r '.format(self.s_bar, self.p, _show_time(self.sec_rest, 1)), end='', flush=true)
if self.trigger:
self._close()
def _refresh(self):
# 進度條監視器,負責初始化、更新以及關閉進度條
self.n += 1
# 初始化進度條
if self.trigger:
print('任務{}開始...'.format('({})'.format(self.mission_nm) if self.mission_nm else ''))
self.n = 1
self.start_time = time.time()
self.trigger = false
self.s_bar = self.s_bar_n*50
# 關閉進度條
if self.n == self.n:
self.trigger = true
self.s_bar = self.s_bar_f * 50
# 更新進度條
n_fill = int(self.n / self.n * self.len_bar)
self.s_bar = self.s_bar_f * n_fill + self.s_bar_n * (self.len_bar - n_fill)
# 估計剩餘時間
self.p = self.n / self.n
sec = int((time.time() - self.start_time) / self.p)
self.sec_rest = int((1 - self.p) * sec) # 估計剩餘秒數
def _close(self):
sec = time.time() - self.start_time
s_time = _show_time(sec, 3, false)
print('\n任務執行完畢,總共用時...'.format('({})'.format(self.mission_nm) if self.mission_nm else '', s_time))
這個動作條的適用條件:必須能拆解成for/while迴圈,在迴圈的每一步中呼叫.go()方法即可。
詳細樣例如下:
pb = processbar(1000, '模擬任務')
for i in range(1000):
if pb.n%100 == 0:
# 可以在任務執行過程中列印想要列印的資訊,卻不影響動作條
pb.go('已經過去100條了...')
else:
pb.go()
time.sleep(0.01)
執行以上**,會得到下圖效果:
執行完畢後效果如下:
優雅的使用python
優雅的使用python,讓自己的code更pythonic test list 龍母 雪諾 提里昂 山姆 count 0 for name in test list print s的序號是 d name,count count 1龍母的序號是 0 雪諾的序號是 1 提里昂的序號是 2 山姆的序號是 ...
Python優雅技巧
不要這麼做 i 0 foritem in iterable print i,item i 1而是這樣 for i,item in enumerate iterable print i,itemenumerate可以接受第二個引數,例如 list enumerate abc 0,a 1,b 2,c l...
極度的冷靜與耐心
如果乙個bug你花了兩三個小時沒解決,你會什麼心理?再兩三個下午沒解決,你會什麼心理?再兩三天沒解決,你會什麼心理?我今天算是嚴重體會到程式設計師的憂桑了。源於我把blogversion2部署到sae無法進入admin 這種修煉,絕對不是常人能夠輕易接受的。在這個過程中,你將不斷質疑自己的智商,不斷...