tqdm
是一个 Python 库,用于在循环中显示进度条。它提供了一个简单的方法来显示迭代过程的进度,并可以应用于任何可迭代对象,如列表、元组、字典等。tqdm
的名称来自于阿拉伯语词汇 “taqaddum”,意为 “进展”。
下面是 tqdm
模块的详解:
要使用 tqdm
,首先需要将其安装在你的 Python 环境中。可以使用以下命令通过 pip 安装:
pip install tqdm
安装完成后,你可以在代码中导入 tqdm
模块:
from tqdm import tqdm
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。上述参数中,iterable
是 tqdm
类的必需参数,其余参数都是可选的。
使用这些参数,你可以根据需要自定义进度条的描述、单位、格式、宽度等。例如,可以使用 desc
参数设置进度条的描述文字,使用 bar_format
参数自定义进度条的格式,使用 unit_scale
参数进行单位缩放等。
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
循环中使用这个对象进行迭代。在每次迭代时,进度条会根据完成的比例进行更新。
你可以根据需要自定义进度条的外观。
例如,下面的代码演示了如何使用自定义参数来创建进度条:
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}
表示左侧的进度条
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}
表
在异步环境下,当多个进度条同时进行更新时,可能会导致进度条的显示出现多行的情况。这是因为异步任务的执行是并行的,多个任务同时更新进度条可能会导致输出混乱。
这个问题可以通过以下方法来解决:
tqdm
的 position
参数: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
参数为两个进度条指定了不同的位置,确保它们在终端中的固定位置显示,避免了多行显示的问题。