雕蟲小技 極度優雅的PYTHON進度條

2021-10-09 20:54:13 字數 3593 閱讀 4262

很多時候執行時間較長的指令碼的時候,需要在指令碼裡寫入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 這種修煉,絕對不是常人能夠輕易接受的。在這個過程中,你將不斷質疑自己的智商,不斷...