程序运行时,默认是不提供进度信息的,在迭代时若想看到程序运行速度和时间,就此时需要使用进度条信息或日志信息来展示程序进度,tqdm是python的第三方进度条库,功能强大且易于使用,今天我们来学习如何使用tqdm实时显示程序进度信息。
pip install 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.stderrncols=None
, 进度条长度或宽度mininterval=0.1
, 进度条最小的更新间隔,单位秒,默认:0.1maxinterval=10.0
, 进度条最大更新间隔,单位秒,默认:10unit='it'
, 单位,默认it每秒迭代数bar_format=None
, 进度条格式ascii
, 是否使用asciipostfix
, 字典形式信息,例如:速度=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的参数,美化输出结果。
涉及参数: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
注意在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)
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的一些简单的用法和自定义信息格式的用法,至于更深入的用法,欢迎大家去官网查阅文档.