【💊 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
119會員
268內容數
哈囉,我是阿Han,是一位 👩‍💻 軟體研發工程師,喜歡閱讀、學習、撰寫文章及教學,擅長以圖代文,化繁為簡,除了幫助自己釐清思路之外,也希望藉由圖解的方式幫助大家共同學習,甚至手把手帶您設計出高品質的軟體產品。
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
阿Han的沙龍 的其他內容
您是否苦於網路資訊爆炸嗎? 教學何其多,但卻無法好好選擇的困境呢? 歡迎加入「🔒 阿Han的軟體心法實戰營」, 這裡不給您冗餘的雜訊, 單刀直入直接送您重點, 避開選擇障礙的困境, 讓您獲得業界標準的開發起手式, 成為Top 1的頂尖人才。 我們是不是常常看到一些很厲害的專案, 只要「pip i
我們在安裝程式的時候, 通常安裝包都會有進度條的顯示, 雖然那是GUI的部份, 但命令列是否也可以這樣呢? 答案是可以的, 在Python就有這麼一套工具專門在顯示我們程式運行的進度, 只要掌握如何回報進度、更新進度, 接下來渲染與互動的部份就交由tqdm這套件去處理即可。 這會對於我們在掌握
您是否苦於網路資訊爆炸嗎? 教學何其多,但卻無法好好選擇的困境呢? 歡迎加入「🔒 阿Han的軟體心法實戰營」, 這裡不給您冗餘的雜訊, 單刀直入直接送您重點, 避開選擇障礙的困境, 讓您獲得業界標準的開發起手式, 成為Top 1的頂尖人才。 有時候我們在處理字幕檔或者是音訊時, 常常會計算時間這
我們開發程式的過程中難免會依賴DB或其他服務, 但複雜的網路環境下我們並沒有辦法確保我們發送的請求是否正確的送達, 因此我們可以在程式中加入Retry機制, 提升我們軟體的強健性。 然而在Python的程式語言裡正好有一個 tenacity 套件非常適合讓我們的Retry作業更加順利, 它是一
這個章節雖然發生問題, 但也很好的為我們如何解決問題的能力而訓練, 我們也會搭配AI來幫我們找問題, 當然也會一五一十的告訴您該如何問對問題, 關於問對問題很重要可以參考「」, 我們相信過程會對大家有幫助, 請耐心閱讀…, 我們會告訴您AI說正確但事實上並非正確的情境。 我們在「【🔒 Pytho
我們在「【資料處理神器區 - Pytube系列】 蒐集情報讓數據會說話」有介紹怎麼分析Youtube影音資訊,但過程中卻遇到了一些問題...,沒關係,動動手做個Maker來解決麻煩吧! 前景提要 故事是這樣的, 小明在使用pytube進行Youtube頻道的分析時, 發現到奇怪, 原本抓影片可以
您是否苦於網路資訊爆炸嗎? 教學何其多,但卻無法好好選擇的困境呢? 歡迎加入「🔒 阿Han的軟體心法實戰營」, 這裡不給您冗餘的雜訊, 單刀直入直接送您重點, 避開選擇障礙的困境, 讓您獲得業界標準的開發起手式, 成為Top 1的頂尖人才。 我們是不是常常看到一些很厲害的專案, 只要「pip i
我們在安裝程式的時候, 通常安裝包都會有進度條的顯示, 雖然那是GUI的部份, 但命令列是否也可以這樣呢? 答案是可以的, 在Python就有這麼一套工具專門在顯示我們程式運行的進度, 只要掌握如何回報進度、更新進度, 接下來渲染與互動的部份就交由tqdm這套件去處理即可。 這會對於我們在掌握
您是否苦於網路資訊爆炸嗎? 教學何其多,但卻無法好好選擇的困境呢? 歡迎加入「🔒 阿Han的軟體心法實戰營」, 這裡不給您冗餘的雜訊, 單刀直入直接送您重點, 避開選擇障礙的困境, 讓您獲得業界標準的開發起手式, 成為Top 1的頂尖人才。 有時候我們在處理字幕檔或者是音訊時, 常常會計算時間這
我們開發程式的過程中難免會依賴DB或其他服務, 但複雜的網路環境下我們並沒有辦法確保我們發送的請求是否正確的送達, 因此我們可以在程式中加入Retry機制, 提升我們軟體的強健性。 然而在Python的程式語言裡正好有一個 tenacity 套件非常適合讓我們的Retry作業更加順利, 它是一
這個章節雖然發生問題, 但也很好的為我們如何解決問題的能力而訓練, 我們也會搭配AI來幫我們找問題, 當然也會一五一十的告訴您該如何問對問題, 關於問對問題很重要可以參考「」, 我們相信過程會對大家有幫助, 請耐心閱讀…, 我們會告訴您AI說正確但事實上並非正確的情境。 我們在「【🔒 Pytho
我們在「【資料處理神器區 - Pytube系列】 蒐集情報讓數據會說話」有介紹怎麼分析Youtube影音資訊,但過程中卻遇到了一些問題...,沒關係,動動手做個Maker來解決麻煩吧! 前景提要 故事是這樣的, 小明在使用pytube進行Youtube頻道的分析時, 發現到奇怪, 原本抓影片可以
你可能也想看
Google News 追蹤
Thumbnail
現代社會跟以前不同了,人人都有一支手機,只要打開就可以獲得各種資訊。過去想要辦卡或是開戶就要跑一趟銀行,然而如今科技快速發展之下,金融App無聲無息地進到你生活中。但同樣的,每一家銀行都有自己的App時,我們又該如何選擇呢?(本文係由國泰世華銀行邀約) 今天我會用不同角度帶大家看這款國泰世華CUB
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
Thumbnail
有別於先前利用time模組做成裝飾器計算程式執行的時間,Python 標準庫中的timeit 模組是專門用來測量小段程式碼的執行時間。 [Python][裝飾器]計算函式(CT)處理時間 這篇文章將介紹如何使用 timeit.timeit() 函數,並提供一些範例來展示它的應用。
Thumbnail
本文利用pyqt5,使用pyttsx3將QLineEdit(單行輸入框)的字串,轉成語音呈現出來。
在Python中, 要寫一個完整的「符元化類 Tokenizer Class」, 這個Class需要的功能有: 1.「編碼 Encode」:將「文本 Text」分割成「符元 Token」。 2.「詞彙 Vocabulary」:將「符元 Token」映射到「符元ID TokenID
Thumbnail
本文詳細介紹了Python中的各種資料型別,包括整數、字串、清單、元組、集合和字典,並提供了相關的操作範例。此外,還解釋了如何在Python中定義和操作變數,包括如何同時對多個變數進行賦值。
Thumbnail
Python語法包括條件語句、迴圈、函數和變數的使用。條件語句如if、elif和else用於進行條件判斷,for和while是兩種主要的迴圈,def用於定義函數。變數可以被賦予數字或字符串,並可使用類型提示來指定變數的類型。註解可以是單行或多行,並可用於解釋函數或類的用途和作用。
Thumbnail
TickTick(滴答清單)是一款功能豐富的任務管理工具,可以幫助使用者有效安排時間和任務,提升個人效率。這篇文章介紹了TickTick的功能特點、使用技巧和付費會員相關事項,並以作者個人的使用體驗為例,為讀者提供了對於TickTick的全面瞭解。
Thumbnail
在Python中,queue是一個非常有用的模块。 它提供了多種佇列(queue)實現,用於在多線程環境中安全地交換信息或者數據。 佇列(queue)是一種先進先出(FIFO)的數據結構,允許在佇列的一端插入元素,另一端取出元素。(FIFO 是First In, First Out 的縮寫)
Thumbnail
本篇文章將教你如何使用Python和PyQt5來建立一個GUI應用程式。PyQt5是一個相當流行的Python模組,透過這個文章你將學習如何使用它來建立一個互動式的應用程式。
Thumbnail
Python 提供了一系列內建函式,其中一部分涉及數學和數學操作。 以下是一些常用的內建函式和數學相關的函式: 基本數學運算: abs(x): 返回 x 的絕對值。 result = abs(-5) print(result) # 輸出: 5 max(iterable) 和 min(
Thumbnail
本文介紹了Python中函式引數的*args和**kwargs用法,通過*args處理可變數量的位置引數,通過**kwargs處理可變數量的關鍵字引數。不僅介紹了相應的語法和程式範例,還解釋了它們的順序問題和建議的慣例用法。
Thumbnail
現代社會跟以前不同了,人人都有一支手機,只要打開就可以獲得各種資訊。過去想要辦卡或是開戶就要跑一趟銀行,然而如今科技快速發展之下,金融App無聲無息地進到你生活中。但同樣的,每一家銀行都有自己的App時,我們又該如何選擇呢?(本文係由國泰世華銀行邀約) 今天我會用不同角度帶大家看這款國泰世華CUB
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
Thumbnail
有別於先前利用time模組做成裝飾器計算程式執行的時間,Python 標準庫中的timeit 模組是專門用來測量小段程式碼的執行時間。 [Python][裝飾器]計算函式(CT)處理時間 這篇文章將介紹如何使用 timeit.timeit() 函數,並提供一些範例來展示它的應用。
Thumbnail
本文利用pyqt5,使用pyttsx3將QLineEdit(單行輸入框)的字串,轉成語音呈現出來。
在Python中, 要寫一個完整的「符元化類 Tokenizer Class」, 這個Class需要的功能有: 1.「編碼 Encode」:將「文本 Text」分割成「符元 Token」。 2.「詞彙 Vocabulary」:將「符元 Token」映射到「符元ID TokenID
Thumbnail
本文詳細介紹了Python中的各種資料型別,包括整數、字串、清單、元組、集合和字典,並提供了相關的操作範例。此外,還解釋了如何在Python中定義和操作變數,包括如何同時對多個變數進行賦值。
Thumbnail
Python語法包括條件語句、迴圈、函數和變數的使用。條件語句如if、elif和else用於進行條件判斷,for和while是兩種主要的迴圈,def用於定義函數。變數可以被賦予數字或字符串,並可使用類型提示來指定變數的類型。註解可以是單行或多行,並可用於解釋函數或類的用途和作用。
Thumbnail
TickTick(滴答清單)是一款功能豐富的任務管理工具,可以幫助使用者有效安排時間和任務,提升個人效率。這篇文章介紹了TickTick的功能特點、使用技巧和付費會員相關事項,並以作者個人的使用體驗為例,為讀者提供了對於TickTick的全面瞭解。
Thumbnail
在Python中,queue是一個非常有用的模块。 它提供了多種佇列(queue)實現,用於在多線程環境中安全地交換信息或者數據。 佇列(queue)是一種先進先出(FIFO)的數據結構,允許在佇列的一端插入元素,另一端取出元素。(FIFO 是First In, First Out 的縮寫)
Thumbnail
本篇文章將教你如何使用Python和PyQt5來建立一個GUI應用程式。PyQt5是一個相當流行的Python模組,透過這個文章你將學習如何使用它來建立一個互動式的應用程式。
Thumbnail
Python 提供了一系列內建函式,其中一部分涉及數學和數學操作。 以下是一些常用的內建函式和數學相關的函式: 基本數學運算: abs(x): 返回 x 的絕對值。 result = abs(-5) print(result) # 輸出: 5 max(iterable) 和 min(
Thumbnail
本文介紹了Python中函式引數的*args和**kwargs用法,通過*args處理可變數量的位置引數,通過**kwargs處理可變數量的關鍵字引數。不僅介紹了相應的語法和程式範例,還解釋了它們的順序問題和建議的慣例用法。