progressbar

About 3 min

[toc]

progressbar

https://tqdm.github.io/docs/tqdm/open in new window

Install

pip install tdqm
from tqdm import tqdm

Basic

iterable

手动关闭

l1 = list(range(5))

# tdqm(a iterable object, not iterator)
pbar1 = tqdm(l1)
for i in pbar1:
    # print(i) , 迭代的东西还是可以用的
    sleep(0.5)
pbar1.close()

'''
100%|██████████| 5/5 [00:00<00:00, 92385.55it/s]
'''

with自动关闭

with tqdm(range(5)) as pbar2:
    for i in pbar2:
        # print(i)
        sleep(0.5)

PS: pbar1 = tqdm(l1)pbar2 = tqdm(l2)要是写在一起, 那么第二个进度条就不会显示出来. 所以创建pbar2 = tqdm(l2)要写在pbar1.close()后面.

pbar1 = tqdm(range(5))
# pbar2 = tqdm(range(5)) # 不该写在这里

for i in pbar1:
    sleep(0.5)
pbar1.close()

pbar2 = tqdm(range(5))
for i in pbar2:
    sleep(0.5)

total

# 一共10个
with tqdm(total=10) as pbar:
    for i in range(10):
        pbar.update(1)  # 每次更新1个
        sleep(0.1)

write

有时候 print 输出会跟在进度条的后面,半天找不到。

tqdm.write()来替代,不过tqdm.write(i)不行,需要 str

(method) def write(
    s: str,
    file: SupportsWrite[str] | None = None,
    end: str = "\n",
    nolock: bool = False
) -> None
for i in pbar1:
    # print(i)
    tqdm.write(f"{i}")

enumerate问题

tqdm要放在最外面,反之则能用但无进度条效果。

tqdm(enumerate(list0))

Advance

前缀

这种方式用于没有动态内容的前缀

with tqdm(range(3),desc='Prefix') as pbar5:
    for i in pbar5:
        sleep(0.25)
'''
Prefix: 100%|██████████| 3/3 [00:00<00:00,  3.99it/s]
'''

这种方式用于有动态内容的前缀

with tqdm(range(3)) as pbar6:
    for i in pbar6:
        # 动态展示当前运行到的 i
        pbar6.set_description(f'Dynamic Prefix-{i}')
        sleep(0.25)

'''
Dynamic Prefix-1:  33%|███▎      | 1/3 [00:00<00:00,  2.32it/s]
Dynamic Prefix-2: 100%|██████████| 3/3 [00:00<00:00,  3.98it/s]
'''

后缀

pbar1 = tqdm(range(5))

for i in pbar1:
    pbar1.set_postfix(KEY='VALUE', a_num = 1, a_bool= False, a_list=[1,2])
    sleep(0.1)
'''
100%|██████████| 10/10 [00:01<00:00,  9.90it/s, KEY=VALUE, a_bool=0, a_list=[1, 2], a_num=1]
'''

颜色

with tqdm(range(3), colour='#00ff00') as pbar5:
    for i in pbar5:
        sleep(0.25)

单位

描述处理项目的文字, 默认是'it', 例如: 100 it/s, 处理照片的话设置为'img' ,则为 100 img/s, 下载时设为'B'.

pbar2 = tqdm(range(5), unit="单位")
for i in pbar2:
    sleep(0.5)

'''
100%|██████████| 5/5 [00:02<00:00,  1.99单位/s]
'''

数字换算

自动根据国际标准进行项目处理速度的换算, 例如 100000 it/s >> 100k it/s

total_size = 123456
l1 = list(range(total_size))
with tqdm(total=total_size, unit_scale=True) as pbar:
    for i in l1:
        pbar.update(1000)
        sleep(0.1)

'''
unit_scale默认False: 
32%|███▏      | 40000/123456 [00:03<00:08, 10142.84it/s]

unit_scale=True: 
59%|█████▉    | 73.0k/123k [00:07<00:05, 10.1kit/s]
'''

起点

l1 = list(range(40))
pbar1 = tqdm(l1, initial=30)
for i in pbar1:
    sleep(0.5)
pbar1.close()

'''
...
100%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 39/39 [00:04<00:00,  2.00it/s]10
40it [00:05,  2.00it/s]
41it [00:05,  2.00it/s]
...
'''

已运行的时间还是从0开始,剩余时间也没问题。但是小心迭代次数还是l1的40次,而不是10次。

所以,后续就是没有条的进度条,迭代完40次。

不行。

Other Environment

# the above is tqdm.std
from tqdm import tqdm, trange
# jupyter notebook
from tqdm.notebook import tqdm, trange
# 自动选择合适的引入,根据顺序
# - tqdm.autonotebook: Automatically choose between tqdm.notebook and tqdm.std
# - tqdm.asyncio
# - tqdm.std
from tqdm.auto import trange, tqdm

图形化界面:

from tqdm.tk import tqdm, trange

图 2

from tqdm.gui import tqdm, trange

图 1