当前位置: 首页 > 工具软件 > Tqdm > 使用案例 >

拯救‘等待焦虑综合征‘ ,Tqdm实时显示程序进度

霍襦宗
2023-12-01

程序运行时,默认是不提供进度信息的,在迭代时若想看到程序运行速度和时间,就此时需要使用进度条信息或日志信息来展示程序进度,tqdm是python的第三方进度条库,功能强大且易于使用,今天我们来学习如何使用tqdm实时显示程序进度信息。

tqdm的安装

pip install tqdm

tqdm的使用

tqdm这个库非常强大,即提供了对外的简单接口,也提供了复杂的参数方便扩展。

tqdm基本介绍

在使用tqdm之前,首先需要对它进行做一个简单的介绍,tqdm是一个python的第三方开源库,源代码在:Github

class tqdm():
  """
  Decorate an iterable object, returning an iterator which acts exactly
  like the original iterable, but prints a dynamically updating
  progressbar every time a value is requested.
  """

  def __init__(self, iterable=None, desc=None, total=None, leave=True,
               file=None, ncols=None, mininterval=0.1,
               maxinterval=10.0, miniters=None, ascii=None, disable=False,
               unit='it', unit_scale=False, dynamic_ncols=False,
               smoothing=0.3, bar_format=None, initial=0, position=None,
               postfix=None, unit_divisor=1000):

这里简单介绍一下常用的参数:

  • desc=None, str类型,作为进度条说明,重要参数
  • total=None, 预期的迭代次数 ,重要参数
  • file=None, 输出方式,默认为sys.stderr
  • ncols=None, 进度条长度或宽度
  • mininterval=0.1, 进度条最小的更新间隔,单位秒,默认:0.1
  • maxinterval=10.0, 进度条最大更新间隔,单位秒,默认:10
  • unit='it', 单位,默认it每秒迭代数
  • bar_format=None, 进度条格式
  • ascii, 是否使用ascii
  • postfix, 字典形式信息,例如:速度=5

基于可迭代

基于可迭代的有两种方式,一种是基于tqdm,另一种是基于trange

基于tqdm的可迭代用法

from tqdm import tqdm
from time import sleep

text = ""
for char in tqdm(["a", "b", "c", "d"]):
    sleep(0.25)
    text = text + char
100%|███████████████████████████| 4/4 [00:01<00:00,  3.98it/s]

基于trange的可迭代用法

from tqdm import trange
from time import sleep

for i in trange(100): #迭代100次
    sleep(0.01)
100%|███████████████████████████| 100/100 [00:01<00:00, 89.07it/s]

实际上, trange(100)等价于tqdm(range(100))

基于手动控制更新的

顾名思义,我们也可以手动控制每一次程序的更新.

from tqdm import tqdm
from time import sleep

  

with tqdm(total=100) as pbar:  # total=100代表目标是100
	for i in range(10):
		sleep(0.1)
		pbar.update(10) # 每次更新10
100%|███████████████████████████| 100/100 [00:01<00:00, 89.07it/s]

注意,在这里程序相对复杂一些,tqdm里面多了个total,以及update参数

tqdm的高级用法

上面的用法相对比较简单,程序的输出只有进度条和百分比,没有更多的信息了,下面我们尝试组合不同的tqdm的参数,美化输出结果。

进度条前加信息

涉及参数:desc

from tqdm import tqdm
from time import sleep

text = ""
for char in tqdm(["a", "b", "c", "d"], desc='打印字符'):
	sleep(0.25)
	text = text + char
打印字符: 100%|███████████████████████████|| 4/4 [00:01<00:00,  3.93it/s]

或者set_description

from tqdm import tqdm
from time import sleep

with tqdm(total=100) as pbar:
    for i in range(10):
        sleep(0.1)
        pbar.set_description("下载进度")
        pbar.update(10)
下载进度: 100%|███████████████████████████| 100/100 [00:01<00:00, 98.16it/s]

修改进度条

涉及参数:ascii

注意ascii需要有两个字符,第一个字符代表未完成,第二个字符代表已完成

from tqdm import tqdm
from time import sleep

with tqdm(total=100, ascii='0+') as pbar:
    for i in range(100):
        sleep(0.1)
        pbar.set_description("下载进度")
        pbar.update(1)
36%|+++++++++++00000000000000000000000000000|36/100 [00:10<00:00,  9.66it/s]

进度条后加信息

from tqdm import tqdm, trange
from random import random, randint
from time import sleep

with trange(100) as t:
    for i in t:
        t.set_description('下载进度')
        t.set_postfix(val = i) # 以字典的形式在后面展示信息
        sleep(0.1)
下载进度:  76%|██████▎                        | 76/100 [00:07<00:02,  9.55it/s, val=76]

进度条自定义信息格式

默认的进度条信息格式为:

from time import sleep
from tqdm import tqdm 

with tqdm(total=100, bar_format="{l_bar}{bar}{r_bar}") as t:
    for i in range(100):
        sleep(0.01)
        t.update(1)
100%|███████████████████████████| 100/100 [00:01<00:00, 98.16it/s]

bar_format格式为{l_bar}{bar}{r_bar},其中

  • {l_bar}{desc}:{percentage:3.0f}%|
  • {r_bar}| {n_fmt}/{total_fmt} [{elapsed}<{remaining}, {rate_fmt}{postfix}]

所以我们在上面的例子中,修改进度条前的信息实质上修改的是{desc},修改进度条后的信息实质上修改的是{postfix}
下面我们试试自定义信息格式

from time import sleep
from tqdm import tqdm 

with tqdm(total=100, bar_format="{postfix[0]}|{bar}|{postfix[1][value]}%",
          postfix=["下载数据中", dict(value=0)]) as t:
    for i in range(100):
        sleep(0.1)
        t.postfix[1]["value"] = i + 1
        t.update(1)
下载数据中|█████████████████████████████████████████████████████████████|100%

tqdm与其他程序搭配

上面展示的例子都是比较简单的,下面我们来展示以下如何搭配其他程序来使用tqdm

在jupyter中使用tqdm

注意在jupyter中使用tqdm,不能用上面的方法:from tqdm import tqdm,使用上面的代码,会导致jupyter显示多个进度条,实际上应该使用from tqdm.notebook import trange, tqdm

具体用法参考下面例子:

from tqdm.notebook import trange, tqdm
from time import sleep

for i in trange(3, desc='1st loop'):
    for j in tqdm(range(100), desc='2nd loop'):
        sleep(0.01)

搭配requests实现大文件下载

from tqdm import tqdm
import requests
from contextlib import closing
import hashlib


def download(url, file_path):
    m = hashlib.md5()
    with open(file_path, 'wb') as code:
        with closing(requests.get(url, stream=True)) as res:
            file_size_str = res.headers.get('Content-Length')
            with tqdm(total=int(file_size_str)) as pbar:
                for chunk in res.iter_content(chunk_size=10240):
                    code.write(chunk)
                    m.update(chunk)
                    pbar.set_description("下载进度")
                    pbar.update(len(chunk))

download('https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/Anaconda3-5.3.1-Windows-x86_64.exe', 'test.exe')

总结

总体来说,tqdm的用法还是比较简单的,但是功能还是很强大,实际上tqdm不止是上面列出的功能,限于篇幅,本文只能是讲解了一下tqdm的一些简单的用法和自定义信息格式的用法,至于更深入的用法,欢迎大家去官网查阅文档.

 类似资料: