python进度库-tqdm的自定义能力

今天罗列几个关于 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()
posted @ 2024-10-31 10:11  百衲本  阅读(104)  评论(0编辑  收藏  举报
cnblogs_post_body { color: black; font: 0.875em/1.5em "微软雅黑" , "PTSans" , "Arial" ,sans-serif; font-size: 15px; } cnblogs_post_body h1 { text-align:center; background: #333366; border-radius: 6px 6px 6px 6px; box-shadow: 0 0 0 1px #5F5A4B, 1px 1px 6px 1px rgba(10, 10, 0, 0.5); color: #FFFFFF; font-family: "微软雅黑" , "宋体" , "黑体" ,Arial; font-size: 23px; font-weight: bold; height: 25px; line-height: 25px; margin: 18px 0 !important; padding: 8px 0 5px 5px; text-shadow: 2px 2px 3px #222222; } cnblogs_post_body h2 { text-align:center; background: #006699; border-radius: 6px 6px 6px 6px; box-shadow: 0 0 0 1px #5F5A4B, 1px 1px 6px 1px rgba(10, 10, 0, 0.5); color: #FFFFFF; font-family: "微软雅黑" , "宋体" , "黑体" ,Arial; font-size: 20px; font-weight: bold; height: 25px; line-height: 25px; margin: 18px 0 !important; padding: 8px 0 5px 5px; text-shadow: 2px 2px 3px #222222; } cnblogs_post_body h3 { background: #2B6695; border-radius: 6px 6px 6px 6px; box-shadow: 0 0 0 1px #5F5A4B, 1px 1px 6px 1px rgba(10, 10, 0, 0.5); color: #FFFFFF; font-family: "微软雅黑" , "宋体" , "黑体" ,Arial; font-size: 18px; font-weight: bold; height: 25px; line-height: 25px; margin: 18px 0 !important; padding: 8px 0 5px 5px; text-shadow: 2px 2px 3px #222222; } 回到顶部 博客侧边栏 回到顶部 页首代码 回到顶部 页脚代码