Python tqdm模块 | 如何创建终端进度条

Python tqdm模块 | 如何创建终端进度条

每当我们安装任何Python库、模块或软件时,我们都会在屏幕上看到进度条,该进度条表示估计完成或渲染该过程需要多长时间的小进度条。它给我们一种活动的印象,可以安抚神经。我们都熟悉各种进度条。其中一些有吸引力,一些则无聊。

在本文中,我们将创建进度条,而不涉及Python的核心日志记录库。

进度条根据完成任务的进度百分比而填充。可以通过将 处理的项目数 除以 总输入项目数。 计算进度。各种因素会影响进度条,例如网络速度、延迟,以及持久化数据到本地存储以得出更准确的到达预计时间(Estimated Time of Arrival,ETA)。

我们可以使用名为 Python 的外部库 tqdm 创建简单且无麻烦的进度条。我们可以将它添加到代码中,使其看起来很可爱。

tqdm在阿拉伯语中代表taqadum,意为进展。Python tqdm模块可在Linux、Windows、Mac等各种平台上工作,并且与IPython/ Jupyter笔记本 兼容。

进度条的需求

如果我们使用较小的数据集进行工作,进度不会影响我们的工作流程。然而,进度条可用于迭代数据集、训练模型或对大量信息集进行编码。

  • 进度条为我们提供了已完成的过程的估计时间。
  • 它向我们提供信息,即进度仍在运行,并未粗暴终止。

先决条件

系统必须安装Python 3,并且我们还可以创建虚拟环境以安装tqdm库。

安装

打开命令行终端并输入以下内容。

pip install tqdm

或者

pip3 install tqdm

上述命令将成功安装在系统中。我们可以使用以下陈述进行验证。

import tqdm

如果没有错误,则表示该库已成功安装。

为循环添加进度条

程序

import time
import sys
from tqdm import trange


def do_something():
    time.sleep(1)

def do_another_something():
    time.sleep(1)


for i in trange(10, file=sys.stdout, desc='outer loop'):
    do_something()

    for j in trange(100,file=sys.stdout, leave=False, unit_scale=True, desc='inner loop'):
        do_another_something()

输出:

outer loop:   0%|          | 0/10 [00:00<?, ?it/s]
inner loop:   0%|          | 0.00/100 [00:00<?, ?it/s]
inner loop:   1%|          | 1.00/100 [00:01<01:40, 1.02s/it]
inner loop:   2%|▏         | 2.00/100 [00:02<01:39, 1.02s/it]
inner loop:   3%|▎         | 3.00/100 [00:03<01:38, 1.01s/it]
inner loop:   4%|▍         | 4.00/100 [00:04<01:37, 1.01s/it]
inner loop:   5%|▌         | 5.00/100 [00:05<01:35, 1.01s/it]
inner loop:   6%|▌         | 6.00/100 [00:06<01:34, 1.01s/it]
inner loop:   7%|▋         | 7.00/100 [00:07<01:34, 1.01s/it]
inner loop:   8%|▊         | 8.00/100 [00:08<01:33, 1.02s/it]
inner loop:   9%|▉         | 9.00/100 [00:09<01:32, 1.02s/it]
inner loop:  10%|█         | 10.0/100 [00:10<01:31, 1.02s/it]
inner loop:  11%|█         | 11.0/100 [00:11<01:30, 1.01s/it]
inner loop:  12%|█▏        | 12.0/100 [00:12<01:29, 1.01s/it]
inner loop:  13%|█▎        | 13.0/100 [00:13<01:28, 1.01s/it]
inner loop:  14%|█▍        | 14.0/100 [00:14<01:29, 1.04s/it]
inner loop:  15%|█▌        | 15.0/100 [00:15<01:27, 1.03s/it]
inner loop:  16%|█▌        | 16.0/100 [00:16<01:26, 1.02s/it]
inner loop:  17%|█▋        | 17.0/100 [00:17<01:24, 1.02s/it]
inner loop:  18%|█▊        | 18.0/100 [00:18<01:23, 1.02s/it]
inner loop:  19%|█▉        | 19.0/100 [00:19<01:22, 1.02s/it]
…………………………………………………………………………………………….
……………………………………………………………………………………………..
It will go till it reached at 100%.

让我们来理解另一个示例。

示例 – 1

# importing modules
from tqdm import trange
from time import sleep

# creating loop
for i in trange(10, desc="loop "):
    # slowing the for loop
    sleep(0.1) 

输出:

loop : 100%|██████████| 10/10 [00:01<00:00, 9.08it/s]


示例

# importing modules
from tqdm import tnrange
from time import sleep

# creating loop
for i in tnrange(2, dec="loop 1"):

    # creating nested loop
    for j in tnrange(5, dec="loop 2"):
        # slowing the for loop
        sleep(0.3)

输出

outer loop:   0%|          | 0/10 [00:00<?, ?it/s]
inner loop:   0%|          | 0.00/100 [00:00<?, ?it/s]
inner loop:   1%|          | 1.00/100 [00:01<01:39, 1.00s/it]
inner loop:   2%|▏         | 2.00/100 [00:02<01:38, 1.00s/it]
inner loop:   3%|▎         | 3.00/100 [00:03<01:37, 1.00s/it]
inner loop:   4%|▍         | 4.00/100 [00:04<01:36, 1.00s/it]
inner loop:   5%|▌         | 5.00/100 [00:05<01:35, 1.00s/it]
inner loop:   6%|▌         | 6.00/100 [00:06<01:34, 1.01s/it]
inner loop:   7%|▋         | 7.00/100 [00:07<01:33, 1.01s/it]
inner loop:   8%|▊         | 8.00/100 [00:08<01:32, 1.01s/it]
inner loop:   9%|▉         | 9.00/100 [00:09<01:31, 1.00s/it]
inner loop:  10%|█         | 10.0/100 [00:10<01:30, 1.01s/it]

示例3

# importing modules
import time
import sys
from tqdm import trange


# creating random function
def random_function():
    time.sleep(0.5)


# another random function
def another_random_function():
    time.sleep(0.2)


# defining outer loop
for i in trange(3, file=sys.stdout, desc='Outer loop'):
    random_function()

    # inner loop
    for j in trange(5, file=sys.stdout, desc='Inner loop'):
        another_random_function()

输出:

Outer loop:   0%|          | 0/3 [00:00<?, ?it/s]
Inner loop:   0%|          | 0/5 [00:00<?, ?it/s]
Inner loop:  20%|██        | 1/5 [00:00<00:00,  4.62it/s]
Inner loop:  40%|████      | 2/5 [00:00<00:00,  4.64it/s]
Inner loop:  60%|██████    | 3/5 [00:00<00:00,  4.63it/s]
Inner loop:  80%|████████  | 4/5 [00:00<00:00,  4.65it/s]
Outer loop:  33%|███▎      | 1/3 [00:01<00:03,  1.58s/it]
Inner loop:   0%|          | 0/5 [00:00<?, ?it/s]
Inner loop:  20%|██        | 1/5 [00:00<00:00,  4.91it/s]
Inner loop:  40%|████      | 2/5 [00:00<00:00,  4.85it/s]
Inner loop:  60%|██████    | 3/5 [00:00<00:00,  4.79it/s]
Inner loop:  80%|████████  | 4/5 [00:00<00:00,  4.77it/s]
Outer loop:  67%|██████▋   | 2/3 [00:03<00:01,  1.58s/it]
Inner loop:   0%|          | 0/5 [00:00<?, ?it/s]
Inner loop:  20%|██        | 1/5 [00:00<00:00,  4.43it/s]
Inner loop:  40%|████      | 2/5 [00:00<00:00,  4.56it/s]
Inner loop:  60%|██████    | 3/5 [00:00<00:00,  4.65it/s]
Inner loop:  80%|████████  | 4/5 [00:00<00:00,  4.72it/s]
Outer loop: 100%|██████████| 3/3 [00:04<00:00,  1.57s/it]

预测性手动更新进度条

tqdm模块提供了一种手动在某些时间间隔内更新进度条的功能。当我们以块的形式下载多部分文件或以流式传输数据时,我们可以手动更新进度条函数。让我们来理解一下以下示例。

示例

# importing modules
import time
import sys
from tqdm import tqdm


def task():
    time.sleep(1)


with tqdm(total=100, file=sys.stdout) as pbar:
    for i in range(10):
        task()
        # Here we are updating progress bar manually, useful for streams such as reading files.
        pbar.update(10)
        # Updates in increments of 10 stops at 100

输出:

100%|██████████| 100/100 [00:10<00:00, 9.93it/s]

解释 –

在上面的代码中,我们将属性设置为100。被调用的函数在每次迭代中增加十倍,直到达到100%。我们可以将任何值传递给update()方法。

线程化进度条

我们也可以将Python tqdm包陷入Python线程中。多处理是使用总核心数的最佳方法。tqdm的位置参数允许我们指定要打印此进度条的行偏移量。在脚本未编写的情况下,默认情况下设置为自动。让我们理解以下示例。必须提供该值以同时管理多个进度条。如果忽略此参数,我们的进度条将被不同的线程覆盖。

示例

import time

from random import randrange
from multiprocessing.pool import ThreadPool

from tqdm import tqdm


def func_call(position, total):
    text = 'progressbar #{position}'.format(position=position)
    with  tqdm(total=total, position=position, desc=text) as progress:
        for _ in range(0, total, 5):
            progress.update(5)
            time.sleep(randrange(3))


pool = ThreadPool(10)
tasks = range(5)
for i, url in enumerate(tasks, 1):
    pool.apply_async(func_call, args=(i, 100))
pool.close()
pool.join()

输出:

progressbar #5:   0%|          | 0/100 [00:00<?, ?it/s]
progressbar #2:   0%|          | 0/100 [00:00<?, ?it/s]
progressbar #1:   0%|          | 0/100 [00:00<?, ?it/s]
progressbar #4:   0%|          | 0/100 [00:00<?, ?it/s]
progressbar #3:   0%|          | 0/100 [00:00<?, ?it/s]
progressbar #3:  10%|█         | 10/100 [00:01<00:09,  9.91it/s]
progressbar #5:  10%|█         | 10/100 [00:01<00:09,  9.91it/s]
progressbar #1:  10%|█         | 10/100 [00:02<00:18,  4.97it/s]
progressbar #2:  10%|█         | 10/100 [00:02<00:18,  4.96it/s]
progressbar #4:  10%|█         | 10/100 [00:02<00:18,  4.96it/s]
progressbar #5:  15%|█▌        | 15/100 [00:02<00:11,  7.64it/s]
progressbar #3:  15%|█▌        | 15/100 [00:02<00:11,  7.64it/s]
progressbar #4:  15%|█▌        | 15/100 [00:03<00:17,  4.96it/s]
progressbar #2:  15%|█▌        | 15/100 [00:03<00:17,  4.95it/s]
progressbar #3:  20%|██        | 20/100 [00:04<00:16,  4.71it/s]
progressbar #5:  25%|██▌       | 25/100 [00:04<00:11,  6.58it/s]
progressbar #1:  20%|██        | 20/100 [00:04<00:16,  4.97it/s]
progressbar #2:  20%|██        | 20/100 [00:04<00:16,  4.96it/s]

在Tqdm进度条中添加颜色

颜色可以使进度条非常吸引人。然而,它并不会为进度条的工作方式添加任何新功能。tqdm可以与Colorama一起工作,Colorama是一个简单的跨平台颜色终端文本库。让我们来看下面的示例。

示例

from tqdm import trange
from colorama import Fore

# Cross-platform colored terminal text.
color_bars = [Fore.BLACK,
    Fore.RED,
    Fore.GREEN,
    Fore.YELLOW,
    Fore.BLUE,
    Fore.MAGENTA,
    Fore.CYAN,
    Fore.WHITE]

for color in color_bars:
    for i in trange(int(7e7),
                    bar_format="{l_bar}%s{bar}%s{r_bar}" % (color, Fore.RESET)):
        pass

输出:

Python tqdm模块 | 如何创建终端进度条

结论

我们讨论了与进度条相关的所有基本概念。Python提供了tqdm模块,可以帮助我们进行手动设计。我们为tqdm模块中可以执行的重要操作定义了适用的示例。tqdm模块可以与子进程和线程协作,可以同时运行多个进度条。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程