幾行代碼就能實現漂亮進度條,太贊了!
本文轉載自微信公眾號「Python技術」,作者派森醬。轉載本文請聯系Python技術公眾號。
作為程序員,我們經常會遇到比較耗時的操作,這個時候我們大多數人會無助地等待程序執行完成,有些人會趁機摸一下魚,以便渡過這個無聊看起來又有點未知的時間,我就是這樣做的。
但是,我們也可以選擇另一種方式——用一個炫酷的進度條,來觀察處理進度,也可以及時了解程序運行的情況,做到心中有數。
今天就給大家介紹 Python 的一個庫—— tqdm ,它就能非常完美的支持和解決這些問題,可以實時輸出處理進度而且占用的CPU資源非常少,支持windows、Linux、mac等系統,支持循環處理、多進程、遞歸處理、還可以結合linux的命令來查看處理情況,等進度展示。
安裝
我們常見的安裝方式是直接 pip 安裝:
- pip install tqdm
但是我用這種方式安裝的時候報錯:
看報錯的意思是這個 pypi.org 不是可信網站,于是我加上了:
- pip install tqdm --trusted-host pypi.org
結果還是這個報錯。
這有點無語了。我接著嘗試使用豆瓣的源來進行安裝:
- pip install -i https://pypi.douban.com/simple tqdm
還是一樣的報錯。
但是我瀏覽器訪問這個網站沒問題:https://pypi.org/project/tqdm/
既然這樣,我就把文件下載下來再安裝吧。
下載下來之后,我將 whl 文件放在我的項目目錄,然后使用命令行安裝:
- pip install --trusted-host pypi.org tqdm-4.62.3-py2.py3-none-any.whl
這回安裝沒報錯。我再用命令檢查一下安裝是否成功:
- pip show tqdm
命令行成功顯示信息:
- Name: tqdm
- Version: 4.62.3
- Summary: Fast, Extensible Progress Meter
- Home-page: https://tqdm.github.io
- Author: None
- Author-email: None
- License: MPLv2.0, MIT Licences
- Location: c:\pworkspace\mypy\venv\lib\site-packages
- Requires: colorama
- Required-by:
折騰了半天,終于安裝成功了!
使用實例
本文的示例都是在 jupyter notebook 環境下運行的,不同環境運行的效果會有差別。
我們進入 tqdm 的源碼,可以找到 __init__ 方法:
- def __init__(self, iterable=None, desc=None, total=None, leave=True, file=None,
- ncols=None, mininterval=0.1, maxinterval=10.0, miniters=None,
- ascii=None, disable=False, unit='it', unit_scale=False,
- dynamic_ncols=False, smoothing=0.3, bar_format=None, initial=0,
- position=None, postfix=None, unit_divisor=1000, write_bytes=None,
- lock_args=None, nrows=None, colour=None, delay=0, gui=False,
- **kwargs):
從中我們可以看到 tqdm 支持很多參數,下面列一些常見的參數:
- iterable:可迭代的對象,在手動更新時不需要進行設置。
- desc:字符串,左邊進度條描述文字。
- total:總的項目數。
- leave:布爾值,迭代完成后是否保留進度條。
- file:輸出指向位置,默認是終端, 一般不需要設置。
- ncols:調整進度條寬度,默認是根據環境自動調節長度,如果設置為0,就沒有進度條,只有輸出的信息。
- unit:描述處理項目的文字,默認是'it',例如: 100 it/s,處理照片的話設置為'img' ,則為 100 img/s。
- unit_scale:自動根據國際標準進行項目處理速度單位的換算,例如 100000 it/s >> 100k it/s。
基于可迭代對象使用
直接將可迭代對象傳入作為參數,我們來看一下例子:
- from tqdm import tqdm
- from time import sleep
- for char in tqdm(['h', 'e', 'l', 'l', 'o']):
- sleep(0.25)
- for i in tqdm(range(100)):
- sleep(0.05)
實現的進度條效果如下:
這里面的 tqdm(range()) 我們也可以用 tqdm 提供的 trange() 來代替,可以簡化代碼。
- from tqdm.notebook import trange
- for i in trange(100):
- sleep(0.05)
實現的進度條效果如下:
我們還可以為進度條添加描述:
- pbar = tqdm(range(5))
- for char in pbar:
- pbar.set_description("Progress %d" %char)
- sleep(1)
實現的進度條效果如下:
接下來,我要改變一下進度條的顏色:
手動控制進度條
我們可以使用 with 語句來手動控制進度條。
- with tqdm(total=100) as pbar:
- for i in range(1, 5):
- sleep(1)
- # 更新進度
- pbar.update(10*i)
這里我設置進度條的更新的間隔,設置總數為 total=100,然后分四次,使得進度條按 10%,20%,30%,40%的間隔來更新。
實現的進度條效果如下:
接下來, 我要改變一下進度條的顏色:
- with tqdm(total=100, colour='yellow') as pbar:
- for i in range(1, 5):
- sleep(1)
- # 更新進度
- pbar.update(10*i)
我把進度條改為了黃色。
接下來,我們來個嵌套進度條玩玩。
- for i in trange(3, desc='outer loop'):
- for i in trange(100, desc='inner loop', leave=False):
- sleep(0.01)
這里我用兩層 for 循環實現了嵌套,并且將內層的 參數 leave 設置為 False ,意思是內層的進度條每執行一次都會消失。
我們來看看最終運行的效果:
總結
這個進度條庫的使用方法是不是很簡單,幾行代碼就能為我們的程序增色不少。心動不如行動,趕快用起來吧!