Python进度条tqdm用法详解

目录

    • 1.介绍
    • 2.安装
    • 3.使用
      • 3.1 参数详解
      • 3.2 基本用法
      • 3.3 自定义进度条
      • 4. 异步环境下可能出现多行显示

1.介绍

tqdm 是一个 Python 库,用于在循环中显示进度条。它提供了一个简单的方法来显示迭代过程的进度,并可以应用于任何可迭代对象,如列表、元组、字典等。tqdm 的名称来自于阿拉伯语词汇 “taqaddum”,意为 “进展”。

下面是 tqdm 模块的详解:

2.安装

要使用 tqdm,首先需要将其安装在你的 Python 环境中。可以使用以下命令通过 pip 安装:

pip install tqdm

3.使用

安装完成后,你可以在代码中导入 tqdm 模块:

from tqdm import tqdm

3.1 参数详解

tqdm 类提供了多个参数,用于自定义进度条的外观和行为。以下是 tqdm 类的常用参数及其说明:

  • iterable:可迭代对象,即要迭代的对象。
  • desc:进度条的描述文字,默认为 None。
  • total:总的迭代次数,用于计算进度百分比,默认为 None。
  • leave:控制进度条完成后是否保留,默认为 False。
  • file:指定输出进度条的文件,默认为 sys.stderr
  • ncols:进度条的总宽度,即显示的字符数,默认为 None(自动调整宽度)。
  • bar_format:自定义进度条的格式,默认为 “{desc}: {percentage:3.0f}%|{bar}| {n_fmt}/{total_fmt}”。
  • unit:进度条的单位名称,默认为 “it”。
  • unit_divisor:进度条的单位除数,默认为 1000。
  • unit_scale:控制是否自动缩放单位,默认为 False。
  • dynamic_ncols:控制是否动态调整进度条宽度以适应终端大小,默认为 False。
  • smoothing:控制平滑进度条的更新,默认为 False。
  • mininterval:最小更新间隔时间(秒),用于控制进度条的更新频率,默认为 0.1。
  • maxinterval:最大更新间隔时间(秒),用于控制进度条的更新频率,默认为 10。
  • miniters:最小更新次数,用于控制进度条的更新频率,默认为 1。
  • ascii:控制是否使用 ASCII 字符显示进度条,默认为 False。
  • disable:控制是否禁用进度条,默认为 False。

上述参数中,iterabletqdm 类的必需参数,其余参数都是可选的。

使用这些参数,你可以根据需要自定义进度条的描述、单位、格式、宽度等。例如,可以使用 desc 参数设置进度条的描述文字,使用 bar_format 参数自定义进度条的格式,使用 unit_scale 参数进行单位缩放等。

3.2 基本用法

tqdm 提供了一个迭代器对象,可以在其上使用 for 循环迭代,并使用 tqdm 函数包装要迭代的对象。下面是一个简单的示例,展示如何在循环中使用 tqdm 来显示进度条:

from tqdm import tqdm
import time

# 创建一个要迭代的列表
my_list = range(100)

# 使用 tqdm 迭代列表并显示进度条
for item in tqdm(my_list):
    # 模拟一些计算或处理任务
    time.sleep(0.1)

在上面的例子中,my_list 是一个包含 100 个元素的列表。使用 tqdm(my_list) 创建了一个包装后的迭代器对象,然后在 for 循环中使用这个对象进行迭代。在每次迭代时,进度条会根据完成的比例进行更新。

3.3 自定义进度条

你可以根据需要自定义进度条的外观。

例如,下面的代码演示了如何使用自定义参数来创建进度条:

  • 例子1:
from tqdm import tqdm
import time

my_list = range(100)

# 使用自定义参数创建进度条
for item in tqdm(my_list, desc="Processing", unit="item", unit_scale=True, bar_format="{l_bar}{bar}| {n_fmt}/{total_fmt}"):
    time.sleep(0.1)

上述代码中,desc 参数设置为 “Processing”,unit 参数设置为 “item”,unit_scale 参数设置为 True,这样进度条的显示就会进行单位缩放。bar_format 参数定义了进度条的格式,{l_bar} 表示左侧的进度条

  • 例子2:
from tqdm import tqdm
import time

my_list = range(100)

# 使用自定义参数创建进度条
with tqdm(total=len(my_list), desc="Processing", unit="item", unit_scale=True, ncols=80, bar_format="{l_bar}{bar}| {n_fmt}/{total_fmt}") as pbar:
    for item in my_list:
        # 模拟一些计算或处理任务
        time.sleep(0.1)
        pbar.update(1)

上述代码中,ncols 参数设置进度条的总宽度为 80 个字符,bar_format 参数定义了进度条的格式,{l_bar} 表示左侧的进度条部分,{bar}

4. 异步环境下可能出现多行显示

在异步环境下,当多个进度条同时进行更新时,可能会导致进度条的显示出现多行的情况。这是因为异步任务的执行是并行的,多个任务同时更新进度条可能会导致输出混乱。

这个问题可以通过以下方法来解决:

  1. 使用 tqdmposition 参数:position 参数可以指定进度条在终端中的位置。你可以在创建进度条时指定不同的 position 值,以确保进度条在终端中的固定位置显示。例如:
from tqdm import tqdm
import time

my_list = range(10)

# 使用 position 参数创建进度条
with tqdm(total=len(my_list), desc="Task 1", position=0) as pbar1:
    for item in my_list:
        # 模拟一些计算或处理任务
        time.sleep(0.1)
        pbar1.update(1)

# 异步下载多个文件
async with session.get(url, verify_ssl=False) as resp:
            file_size = int(resp.headers.get('Content-Length', 0))
            async with aiofile.async_open(f"{name}", "wb") as f:
                with tqdm(total=file_size, unit='B', unit_scale=True,position=0) as pbar:
                    async for chunk in resp.content.iter_chunked(1024):
                        await f.write(chunk)
                        pbar.update(len(chunk))

在上述代码中,使用 position 参数为两个进度条指定了不同的位置,确保它们在终端中的固定位置显示,避免了多行显示的问题。

你可能感兴趣的:(Python,python)