【💊 Python的解憂錦囊】 tqdm進度條客製化工序

更新於 發佈於 閱讀時間約 9 分鐘
圖片來源

圖片來源

我們在「【Python 軍火庫🧨 - tqdm】讓我們為工作加上進度條吧」介紹了tqdm進度條的基本用法, 基本上的使用案例都沒什麼問題, 通常也都是以「數量」為單位進行進度的回報, 但假設我們今天處理的任務是關於音訊的部份呢? 這時候更新的單位就需要從「數量」轉為「時間」了, 那tqdm有提供這樣的功能嗎? 答案是有的, 讓我們教您怎麼做。

怎麼做?

我們先從官方文件來看 🔗 請點我看連結, 它是有支援Wrapper功能的, 我們可以自訂一個類別來繼承並修改。

from tqdm import tqdm  # 匯入tqdm庫

class TqdmWrapper(tqdm):
"""提供了一個 `total_time` 格式參數"""

@property
def format_dict(self):
# 取得父類別的format_dict
d = super().format_dict

# 計算總共花費的時間
total_time = d["elapsed"] * (d["total"] or 0) / max(d["n"], 1)

# 更新字典以包含總共花費的時間
d.update(total_time='總計: ' + self.format_interval(total_time))

# 返回更新後的字典
return d

接著我們將原本的tqdm替換成這個客製化類別即可。

for i in TqdmWrapper(
range(10000),
bar_format="{total_time}: {percentage:.0f}%|{bar}{r_bar}"):
""""""
time.sleep(0.1)

預計呈現如下:

總計: 16:43: 2%|██▉     | 239/10000 [00:23<16:19,  9.96it/s]

那以時間為單位呢?

假設我們最小單位是毫秒(millisecond), 我們會希望看到的是總共「hh:mm:ss」目前執行了「hh:mm:ss」, 這時候就需要來點單位的轉換了,首先我們設計個函式是將「毫秒轉換為hh:mm:ss」, 詳細實作細節請參考「【💊 Python的解憂錦囊】Milliseconds To hh:mm:ss(毫秒轉成小時、分鐘和秒)」。

from datetime import timedelta
def milliseconds_to_hms(milliseconds: int) -> str:
"""毫秒轉hh:mm:ss.ffff
"""
time_delta = timedelta(milliseconds=milliseconds)
total_seconds = time_delta.total_seconds()

# 1小時3600
seconds_in_hours = timedelta(hours=1).total_seconds()

# 1分鐘60
seconds_in_minute = timedelta(minutes=1).total_seconds()

# 小時, 剩餘小時的秒數 = 總秒數/3600(1小時=3600)
hours, remainder = divmod(total_seconds, seconds_in_hours)

# 分鐘, 剩餘秒數 = 剩餘小時的秒數/60(1分鐘=60)
minutes, seconds = divmod(remainder, seconds_in_minute)

# 秒, 毫秒 = 剩餘秒數的整數部分和毫秒部分
seconds_int = int(seconds)

return f'{int(hours):02}:{int(minutes):02}:{seconds_int:02}'

接著我們可以設計一下擴展進度條功能。

class TqdmWrapper(tqdm):
"""Tqdm wrapper"""
@property
def format_dict(self):
d = super().format_dict
# 將目前進度ms轉換成hh:mm:ss的格式
n_fmt = milliseconds_to_hms(d['n'])

# 將總數ms轉換成hh:mm:ss的格式
total_fmt = milliseconds_to_hms(d['total'])
d.update(total_fmt=total_fmt, n_fmt=n_fmt)
return d

這邊我們會在tqdm傳參數時設計一個bar_format的樣版。

# n_fmt 對應到客制轉換的hh:mm:ss
# total_fmt 對應到客制轉換的hh:mm:ss
bar_format='{l_bar}{bar}| {n_fmt}/{total_fmt}, [{elapsed}<{remaining}, ' '{rate_fmt}]'

好了, 事前準備作業都完成了, 接下來我們只要規劃一下總共有多少單位的時間需要執行, 每次完成多少時間的資訊即可, 接著預計有多少個工作需要執行。

# 總共需要處理1500000ms
total_ms = 150000

# 每個工作完成1500ms
per_job_ms = 1500

job_nums = round(total_ms / per_job_ms)

with TqdmWrapper(
total=total_ms,
unit='ms',
bar_format='{l_bar}{bar}| {n_fmt}/{total_fmt}, [{elapsed}<{remaining}, ' '{rate_fmt}]'
) as pbar:
for i in range(job_nums):
time.sleep(0.1)
pbar.update(per_job_ms)

我們可以看到總量與目前進度都已經順利被更換成「hh:mm:ss」囉。

35%|██████████   | 00:00:52/00:02:30, [00:03<00:06, 14948.44ms/s]

那可以format哪些內容呢? 🔗 請點我看更多…

圖片來源

圖片來源

l_bar: 進度條的左側部分
bar: 進度條本身
r_bar: 進度條的右側部分
n: 當前進度
n_fmt: 格式化後的當前進度
total: 總進度
total_fmt: 格式化後的總進度
percentage: 完成百分比
elapsed: 已過時間
elapsed_s: 已過時間(以秒為單位)
ncols: 進度條的列數
nrows: 進度條的行數
desc: 描述文字
unit: 單位
rate: 速率
rate_fmt: 格式化後的速率
rate_noinv: 非反比例速率
rate_noinv_fmt: 格式化後的非反比例速率
rate_inv: 反比例速率
rate_inv_fmt: 格式化後的反比例速率
postfix: 附加文字
unit_divisor: 單位除數
remaining: 剩餘時間
remaining_s: 剩餘時間(以秒為單位)
eta: 預計完成時間

結語

這次的主題主要在教您如何對於tqdm這套套件進行客製化, 同時也觀察到這個套件的強大之處, 除了本身就是一套工具之外, 還能夠被引用進行二次開發, 甚至彈性的設計客製化呈現方式, 對於有命令列進度條開發需求的我們來說是非用不可的一套工具。

學習軟體開發的路上常常苦於網路資訊爆炸嗎? 教學何其多,但卻遇到無法明確選擇的困境呢? 歡迎加入「🔒 阿Han的軟體心法實戰營」, 這裡不給您冗餘的雜訊, 單刀直入直接送您業界開發重點, 避開選擇障礙的困境, 讓您獲得業界標準的開發起手式, 成為Top 1的頂尖人才。

留言
avatar-img
留言分享你的想法!
avatar-img
阿Han的沙龍
131會員
289內容數
哈囉,我是阿Han,是一位 👩‍💻 軟體研發工程師,喜歡閱讀、學習、撰寫文章及教學,擅長以圖代文,化繁為簡,除了幫助自己釐清思路之外,也希望藉由圖解的方式幫助大家共同學習,甚至手把手帶您設計出高品質的軟體產品。
阿Han的沙龍的其他內容
2025/01/29
🤔 簡單且靜態就足夠了? 相信我們在開發Python應用程式的過程中, 常常會借用Enum來定義我們可能的選項, 就像顏色紅、綠、黃會有這樣的結構: class Color(str, Enum): RED = 'red' GREED = 'green' YELLOW = 'yel
Thumbnail
2025/01/29
🤔 簡單且靜態就足夠了? 相信我們在開發Python應用程式的過程中, 常常會借用Enum來定義我們可能的選項, 就像顏色紅、綠、黃會有這樣的結構: class Color(str, Enum): RED = 'red' GREED = 'green' YELLOW = 'yel
Thumbnail
2025/01/08
當我們的系統發展到一定程度時, 難免會面臨到正式上線的問題, 要如何讓維運更加簡易呢? 尤其隨著複雜的客製化配置的出現時, 我們應該如何有效的管理, 甚至驗證配置是否如預期資料型態、格式…, 而正好 pydantic 可以滿足這樣的需求, 就讓我們來看看怎麼使用吧! 需安裝的套件 pip i
Thumbnail
2025/01/08
當我們的系統發展到一定程度時, 難免會面臨到正式上線的問題, 要如何讓維運更加簡易呢? 尤其隨著複雜的客製化配置的出現時, 我們應該如何有效的管理, 甚至驗證配置是否如預期資料型態、格式…, 而正好 pydantic 可以滿足這樣的需求, 就讓我們來看看怎麼使用吧! 需安裝的套件 pip i
Thumbnail
2025/01/02
要如何使用unicorn啟動多個FastAPI服務, 歡迎參考我們的「【💊 Python的解憂錦囊 - FastAPI】如何啟動多個Workers」。 當我們試著設計帶入模組化時… 我們在「【💊 Python的解憂錦囊 - FastAPI】使用 lifespan 來共享資料與管理生命週期
Thumbnail
2025/01/02
要如何使用unicorn啟動多個FastAPI服務, 歡迎參考我們的「【💊 Python的解憂錦囊 - FastAPI】如何啟動多個Workers」。 當我們試著設計帶入模組化時… 我們在「【💊 Python的解憂錦囊 - FastAPI】使用 lifespan 來共享資料與管理生命週期
Thumbnail
看更多
你可能也想看
Thumbnail
每年4月、5月都是最多稅要繳的月份,當然大部份的人都是有機會繳到「綜合所得稅」,只是相當相當多人還不知道,原來繳給政府的稅!可以透過一些有活動的銀行信用卡或電子支付來繳,從繳費中賺一點點小確幸!就是賺個1%~2%大家也是很開心的,因為你們把沒回饋變成有回饋,就是用卡的最高境界 所得稅線上申報
Thumbnail
每年4月、5月都是最多稅要繳的月份,當然大部份的人都是有機會繳到「綜合所得稅」,只是相當相當多人還不知道,原來繳給政府的稅!可以透過一些有活動的銀行信用卡或電子支付來繳,從繳費中賺一點點小確幸!就是賺個1%~2%大家也是很開心的,因為你們把沒回饋變成有回饋,就是用卡的最高境界 所得稅線上申報
Thumbnail
全球科技產業的焦點,AKA 全村的希望 NVIDIA,於五月底正式發布了他們在今年 2025 第一季的財報 (輝達內部財務年度為 2026 Q1,實際日曆期間為今年二到四月),交出了打敗了市場預期的成績單。然而,在銷售持續高速成長的同時,川普政府加大對於中國的晶片管制......
Thumbnail
全球科技產業的焦點,AKA 全村的希望 NVIDIA,於五月底正式發布了他們在今年 2025 第一季的財報 (輝達內部財務年度為 2026 Q1,實際日曆期間為今年二到四月),交出了打敗了市場預期的成績單。然而,在銷售持續高速成長的同時,川普政府加大對於中國的晶片管制......
Thumbnail
我們在使用Python語言進行軟體開發時, 常常會需要dict這個資料結構來儲存複雜結構的資料, 就如同JSON一般, 我們會具有這樣的Key/Value模式組成的資料結構, 如下圖: 而當我們在Python的世界裡, 除了嚴謹規範資料欄位的@dataclass之外, 更常使用的就是「di
Thumbnail
我們在使用Python語言進行軟體開發時, 常常會需要dict這個資料結構來儲存複雜結構的資料, 就如同JSON一般, 我們會具有這樣的Key/Value模式組成的資料結構, 如下圖: 而當我們在Python的世界裡, 除了嚴謹規範資料欄位的@dataclass之外, 更常使用的就是「di
Thumbnail
程式碼第二版 1027 剛剛發現之前的程式碼已經不能使用了,我想可能是因為html結構有所改變,另外也想順便處理一下數字如果是含有"K"的數字時,順便轉化一下,時間有限,所以想知道來龍去脈請看下面文章。 【教學】如何用程式碼追蹤Vocus文章每日流量?第一版 【教學】如何用程式碼追蹤V
Thumbnail
程式碼第二版 1027 剛剛發現之前的程式碼已經不能使用了,我想可能是因為html結構有所改變,另外也想順便處理一下數字如果是含有"K"的數字時,順便轉化一下,時間有限,所以想知道來龍去脈請看下面文章。 【教學】如何用程式碼追蹤Vocus文章每日流量?第一版 【教學】如何用程式碼追蹤V
Thumbnail
撰寫Python的朋友都知道multithread/multiprocess能為我們帶來效能的改進,減少硬體資源的閒置,但在撰寫的過程中常常會發現到我們所設計的工作池模式會需要將「待辦清單」的工作項目當成參數傳遞進去執行, 除了「待辦清單」之外, 其餘的參數基本上都是固定的, 基於這樣的需求之下
Thumbnail
撰寫Python的朋友都知道multithread/multiprocess能為我們帶來效能的改進,減少硬體資源的閒置,但在撰寫的過程中常常會發現到我們所設計的工作池模式會需要將「待辦清單」的工作項目當成參數傳遞進去執行, 除了「待辦清單」之外, 其餘的參數基本上都是固定的, 基於這樣的需求之下
Thumbnail
「functools.partial」是Python中的一個標準函式庫,它可以讓我們基於既有的函式封裝成多種不同用途的函式,就如同上圖所示,我們設計了一個乘法(multiply)的函數,使用了partial讓函數的參數「c」固定下來依據用途不同變化出「double」、「triple」,這樣一來我
Thumbnail
「functools.partial」是Python中的一個標準函式庫,它可以讓我們基於既有的函式封裝成多種不同用途的函式,就如同上圖所示,我們設計了一個乘法(multiply)的函數,使用了partial讓函數的參數「c」固定下來依據用途不同變化出「double」、「triple」,這樣一來我
Thumbnail
我們在「【Python 軍火庫🧨 - tqdm】讓我們為工作加上進度條吧」介紹了tqdm進度條的基本用法, 基本上的使用案例都沒什麼問題, 通常也都是以「數量」為單位進行進度的回報, 但假設我們今天處理的任務是關於音訊的部份呢? 這時候更新的單位就需要從「數量」轉為「時間」了, 那tqdm有提供這
Thumbnail
我們在「【Python 軍火庫🧨 - tqdm】讓我們為工作加上進度條吧」介紹了tqdm進度條的基本用法, 基本上的使用案例都沒什麼問題, 通常也都是以「數量」為單位進行進度的回報, 但假設我們今天處理的任務是關於音訊的部份呢? 這時候更新的單位就需要從「數量」轉為「時間」了, 那tqdm有提供這
Thumbnail
我們在安裝程式的時候, 通常安裝包都會有進度條的顯示, 雖然那是GUI的部份, 但命令列是否也可以這樣呢? 答案是可以的, 在Python就有這麼一套工具專門在顯示我們程式運行的進度, 只要掌握如何回報進度、更新進度, 接下來渲染與互動的部份就交由tqdm這套件去處理即可。 這會對於我們在掌握
Thumbnail
我們在安裝程式的時候, 通常安裝包都會有進度條的顯示, 雖然那是GUI的部份, 但命令列是否也可以這樣呢? 答案是可以的, 在Python就有這麼一套工具專門在顯示我們程式運行的進度, 只要掌握如何回報進度、更新進度, 接下來渲染與互動的部份就交由tqdm這套件去處理即可。 這會對於我們在掌握
Thumbnail
在這篇教學中,我們將會學習如何使用 C# 語言再設定的時間動作,模擬批次自動化功能。使用 System.Windows.Forms.Timer 來達到這個目的。同時,我們也將會示範如何取得目前時間的不同屬性,像是年份、日期、分鐘等。
Thumbnail
在這篇教學中,我們將會學習如何使用 C# 語言再設定的時間動作,模擬批次自動化功能。使用 System.Windows.Forms.Timer 來達到這個目的。同時,我們也將會示範如何取得目前時間的不同屬性,像是年份、日期、分鐘等。
Thumbnail
Hi, 大家好。我是茶桁。 这一段Python之旅怎么样?还算顺利吧? 之前我们都学习了些什么?有基本常识,流程,函数,不同类型的数据以及一些模块对吧?并且还做了一些练习来巩固所学过的内容。 那么今天,我们接着来学习模块。不过今天要学的模块和以往不太一样了,以前我们学习的都是Python内
Thumbnail
Hi, 大家好。我是茶桁。 这一段Python之旅怎么样?还算顺利吧? 之前我们都学习了些什么?有基本常识,流程,函数,不同类型的数据以及一些模块对吧?并且还做了一些练习来巩固所学过的内容。 那么今天,我们接着来学习模块。不过今天要学的模块和以往不太一样了,以前我们学习的都是Python内
Thumbnail
大家好,歡迎來到我的學習筆記系列,今天我要跟大家分享一下 Python 的 datetime 模組,這是一個非常實用的模組,可以幫助我們處理日期和時間相關的問題。 datetime 模組提供了四個主要的類別,分別是 date、time、datetime 和 timedelta。
Thumbnail
大家好,歡迎來到我的學習筆記系列,今天我要跟大家分享一下 Python 的 datetime 模組,這是一個非常實用的模組,可以幫助我們處理日期和時間相關的問題。 datetime 模組提供了四個主要的類別,分別是 date、time、datetime 和 timedelta。
Thumbnail
今天來到Day5了,也來到基礎教學的最後一部分,今天要講解的就是函式(function),有分成內建函數,以及自訂函數,再來是import模組,也就是導入py檔,除了可以導入自行撰寫的py檔,網路上也有許多大神分享相當方便使用的py檔,最後再講解一下如何進行異常處理,也就是Debug的部分
Thumbnail
今天來到Day5了,也來到基礎教學的最後一部分,今天要講解的就是函式(function),有分成內建函數,以及自訂函數,再來是import模組,也就是導入py檔,除了可以導入自行撰寫的py檔,網路上也有許多大神分享相當方便使用的py檔,最後再講解一下如何進行異常處理,也就是Debug的部分
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News