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 列。

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

第一个是 ascii = False。第二个是 ascii = True

2. 自定义进度条格式

你可以通过 bar_format 参数来自定义进度条的格式。并且有一些信息只有 tqdm 才"知道"的信息,因此,它内置了一些占位符:
{l_bar} :左边的进度条部分。
{bar} :进度条本身。
{r_bar} :右边的信息部分。
{n} :当前迭代次数。
{total} :总迭代次数。
{percentage} :百分比。
{rate} :每秒迭代次数。
{elapsed} :已用时间。
{remaining} :剩余时间。

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


3.设置进度条颜色

你可以通过 colour 参数来设置进度条的颜色。 colour 可以接受多种颜色名称或 RGB 值。

from tqdm import tqdm
import time
for i in tqdm(range(100), desc="自定义进度条颜色", colour="green"
  time.sleep(0.1)

python进度库-tqdm的自定义能力_动态更新_03


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()

"一劳永逸" 的话,有是有的,而 "一劳永逸" 的事却极少



上一篇:Python库numpy之七


下一篇:我们来学mysql -- 查询成本之索引选择(原理篇)