python進度條tqdm使用方式
安裝tqdm
tqdm是一個顯示進度條的python工具包。
安裝命令如下:
conda install tqdm
或
pip install tqdm
在循環(huán)中顯示進度條
from tqdm import tqdm, trange
1. 使用tqdm.tqdm()實現(xiàn)進度條
示例:
for i in tqdm(range(20), desc='It\'s a test'):
time.sleep(0.1)

2. tqdm()主要參數(shù)默認值與解釋
iterable=None,可迭代對象。如上一節(jié)中的range(20)desc=None,傳入str類型,作為進度條標題。如上一節(jié)中的desc='It\'s a test'total=None,預(yù)期的迭代次數(shù)。一般不填,默認為iterable的長度。leave=True,迭代結(jié)束時,是否保留最終的進度條。默認保留。file=None,輸出指向位置,默認是終端,一般不需要設(shè)置。ncols=None,可以自定義進度條的總長度unit,描述處理項目的文字,默認’it’,即100it/s;處理照片設(shè)置為’img’,則為100img/spostfix,以字典形式傳入詳細信息,將顯示在進度條中。例如postfix={'value': 520}unit_scale,自動根據(jù)國際標準進行項目處理速度單位的換算,例如100000it/s換算為100kit/s
3. tqdm()的返回值
tqdm()的返回值是一個可迭代對象,迭代的每一個元素就是iterable的每一個參數(shù)。
該返回值可以修改進度條信息。
示例:
with tqdm(range(100), desc='Test') as tbar:
for i in tbar:
tbar.set_postfix(loss=i/100, x=i)
tbar.update() # 默認參數(shù)n=1,每update一次,進度+n
time.sleep(0.2)

4. tqdm.trange()
該函數(shù)實際上是封裝了一下tqdm()。
源代碼為:
def trange(*args, **kwargs):
"""
A shortcut for tqdm(xrange(*args), **kwargs).
On Python3+ range is used instead of xrange.
"""
return tqdm(_range(*args), **kwargs)
顯然,trange()的第一個參數(shù)為可迭代對象的長度,其余參數(shù)與tqdm()一致。
示例:
for i in trange(100, desc='Test1'):
time.sleep(0.2)
或
with trange(100, desc='Test2') as tbar:
for i in range(100):
tbar.set_postfix(loss=i/100, x=i)
tbar.update()
time.sleep(0.2)
5. 循環(huán)過程中輸出額外內(nèi)容
在循環(huán)進行中,你可能想要輸出一些內(nèi)容,但是直接使用print輸出會導(dǎo)致進度條出現(xiàn)多行。
解決方法有兩種:
1.參考【3. tqdm()的返回值】示例中的tbar.set_postfix方法,將內(nèi)容直接顯示在進度條尾部。
2.使用tqdm.write('你要顯示的內(nèi)容。')方法;若使用pycharm的Run窗口運行,該方法仍無效或存在格式問題,可能是pycharm的bug,此時請使用方法1或改用終端(Terminal)運行代碼。
for i in tqdm(range(5), desc='Test'):
tqdm.write('當(dāng)前i={}'.format(i))
time.sleep(0.5)

6. 無法獲取迭代器長度的坑
有些迭代器是只能迭代一次的(如zip()),甚至連len()方法都沒有,即tqdm就無法得知它的總長度,從而導(dǎo)致進度條顯示不出來(如下圖)

解決方法:你必須指定total參數(shù),如下
x = range(20)
y = range(20)
data = zip(x, y)
for i in tqdm(data, desc='Test', total=len(x)):
time.sleep(0.1)
*其他方法實現(xiàn)進度條
def process_bar(current, total, prefix='', auto_rm=True):
bar = '=' * int(current / total * 50)
bar = f' {prefix} |{bar.ljust(50)}| ({current}/{total}) {current / total:.1%} | '
print(bar, end='\r', flush=True)
if auto_rm and current == total:
print(end=('\r' + ' ' * len(bar) + '\r'), flush=True)
for i in range(0, 100):
time.sleep(0.1)
process_bar(i+1, 100, '首部信息', auto_rm=False)
print('進度條演示')


總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Python?中如何將十六進制轉(zhuǎn)換為?Base64
本篇文章將介紹在?Python?中將?hex?轉(zhuǎn)換為?base64?的方法,本文結(jié)合實例代碼給大家介紹的非常詳細,需要的朋友可以參考下2023-06-06
python中input()與raw_input()的區(qū)別分析
這篇文章主要介紹了python中input()與raw_input()的區(qū)別,需要的朋友可以參考下2016-02-02
GCN?圖神經(jīng)網(wǎng)絡(luò)使用詳解?可視化?Pytorch
這篇文章主要介紹了GCN?圖神經(jīng)網(wǎng)絡(luò)使用詳解?可視化?Pytorch,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-12-12
Python 列表推導(dǎo)式與字典推導(dǎo)式的實現(xiàn)
本文主要介紹了Python 列表推導(dǎo)式與字典推導(dǎo)式的實現(xiàn),文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-12-12

