今天罗列几个关于 tqdm 常见自定义场景。并尝试对动态更新描述信息做简单的封装,积累一些通用模块。
tqdm 提供了丰富的自定义选项,可以让你根据不同的需求调整进度条的外观和行为,接下来看看他的自定义能力。
tqdm 函数参数:
desc :进度条的描述信息。
total :总迭代次数(默认为 None ,会自动检测)。
leave :是否在完成时保留进度条(默认为 True )。
ncols :进度条的最大宽度(列数)。
ascii :是否使用 ASCII 字符显示进度条(默认为 False )。
bar_format :自定义进度条的格式字符串。
colour :设置进度条的颜色。
1. 基本自定义
from tqdm import tqdm
import time
#基本自定义
for i in tqdm(range(100), desc="Processing", ascii=False, ncols=75):
time.sleep(0.1)
#参数含义
desc="Processing" :设置进度条的描述信息。
ascii=False :不使用 ASCII 字符显示进度条。这个参数默认就是 False ,如果设置为 True,进度条就变成 #
ncols=75 :设置进度条的最大宽度为 75 列。
第一个是 ascii = False。第二个是 ascii = True
2. 自定义进度条格式
你可以通过 bar_format 参数来自定义进度条的格式。并且有一些信息只有 tqdm 才"知道"的信息,因此,它内置了一些占位符:
{l_bar} :左边的进度条部分。
{bar} :进度条本身。
{r_bar} :右边的信息部分。
{n} :当前迭代次数。
{total} :总迭代次数。
{percentage} :百分比。
{rate} :每秒迭代次数。
{elapsed} :已用时间。
{remaining} :剩余时间。
3.设置进度条颜色
你可以通过 colour 参数来设置进度条的颜色。 colour 可以接受多种颜色名称或 RGB 值。
from tqdm import tqdm
import time
for i in tqdm(range(100), desc="自定义进度条颜色", colour="green"
time.sleep(0.1)
4.动态更新描述信息
这个是最常用的功能,你可以在循环中动态更新进度条的描述信息。
from tqdm import tqdm
import time
#必须设置total参数,否则此时tqdm无法确定总数
with tqdm(total=100,desc="动态更新描述信息") as pbar:
for i in range(100):
if i == 20:
pbar.set_description("第一阶段完成")
if i == 40:
pbar.set_description("第二阶段完成")
if i == 60:
pbar.set_description("第三阶段完成")
if i == 80:
pbar.set_description("第四阶段完成")
#必须调用update方法才能更新进度条
pbar. update(1)
time.sleep(o.1)
行5: tqdm(total=100, desc="动态更新描述信息") :创建一个进度条对象,并设置总迭代次数为 100。 with 语句确保在退出块时自动关闭进度条。
行7-17:在特定的迭代次数( i == 20 , i == 40 , i == 60 , i == 80 )时,调用 pbar.set_description() 方法来更新进度条的描述信息。
pbar.update(1) :每次迭代增加进度条 1 个单位。这是必须的,否则进度条不会更新。
上面的写法侵入性太强了,一大堆关于进度的代码混到主循环里面。我们尝试做一些简单封装。
先看看封装后的使用代码有哪些改进:
#示例用法
if __name_ == "_main_":
#使用with 语法创建和使用 CustomTqdm对象
with CustomTqdm(total=100,desc="初始进度", colour="green") as pbar:
#配置不同的更新点
pbar.add_update_point(20,"第一阶段完成")
pbar.add_update_point(40,"第二阶段完成")
pbar.add_update_point(60,"第三阶段完成", colour="blue")
pbar.add_update_point(80,"第四阶段完成", colour="red")
#开始循环
for i in range( 100):
pbar.update(1)
time.sleep(0.1)
行4:使用 with 语法创建和使用 CustomTqdm 对象。当退出 with 语句块时, __exit__ 方法会自动调用 pbar.close() 关闭进度条。
行6-9: 在循环之前,配置不同的更新点。避免循环中出现过多的进度相关代码
行13:在循环中,每次迭代调用 pbar.update(1) 更新进度条。
看看实现代码:
from tqdm import tqdm
import time
class customTqdm :
def _init__(self,total,desc="Progress", colour=None):
"""
初始化CustomTqdm对象。
: param total:总迭代次数
: param desc:初始描述信息
: param colour:进度条的颜色
"""
self.total = total
self.desc = desc
self.colour = colour
self.pbar = tqdm(total=total, desc=desc, colour=colour)
self.update_points =[]
def add_update_point(self,iteration,desc,colour=None):
"""
添加一个更新点。
: param iteration:迭代次数
: param desc:新的描述信息
: param colour:新的颜色
"""
self.update_points.append((iteration,desc,colour))
def update(self, n=1):
"""
更新进度条。
: param n:增加的迭代次数
"""
for point in self.update_points:
iteration,desc, colour = point
if self.pbar.n == iteration - 1:
self.pbar.set_description(desc)
if colour is not None:
self.pbar.colour = colourself.pbar.refresh()
self.pbar.update(n)
def __enter__( self): #支持with 语法的进入方法。
return self
def _exit__(self,exc_type,exc_value,traceback):
#支持with 语法的退出方法。 self.pbar.close()
"一劳永逸" 的话,有是有的,而 "一劳永逸" 的事却极少