Python中神奇的tqdm库,估计多数人没听说过

531 阅读5分钟

大家好,今天我们要聊一个既简单又实用的Python库——tqdm。

你是不是曾经在跑一个耗时很长的程序时,心里默默祈祷:“我的天,什么时候能跑完啊?”有了tqdm帮忙,给你的程序轻轻松松的加上进度条。

为什么需要进度条?

想象一下,假如你在下载一个大文件,或者在进行一些需要大量计算的任务,程序没有进度条,你就只能等待,完全不知道程序是不是还在运行,或者是否卡住了。这种情况不仅让人焦虑,而且还会降低程序的用户体验。

进度条就像是一个“提示器”,告诉你当前任务的进度。它能帮助你判断程序是否正常运行,是否已经接近完成。

安装tqdm

首先,我们需要安装tqdm库。打开命令行,输入以下命令:

pip install tqdm

安装完成后,就可以开始使用了!🎉

基本用法

tqdm的用法非常简单,我们可以直接将它应用于Python的迭代器对象,比如for循环。看下面这个简单的例子:

from tqdm import tqdm
import time

# 模拟一个耗时的任务
for i in tqdm(range(100)):
    time.sleep(0.1)  # 每次暂停0.1秒,模拟任务执行

在这个例子中,tqdm(range(100))会生成一个带有进度条的range对象。当程序执行时,你会看到类似于以下的进度条:

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

每次循环时,进度条会自动更新,直到完成。

自定义进度条

除了默认的进度条样式,tqdm还支持自定义进度条的各种参数。比如,你可以自定义进度条的描述信息、进度条的长度等等。来看一个例子:

from tqdm import tqdm
import time

# 自定义进度条
for i in tqdm(range(100), desc="处理数据", ncols=100, bar_format="{l_bar}{bar}| {n_fmt}/{total_fmt}"):
    time.sleep(0.1)

在这个例子中,我们给进度条添加了描述信息desc="处理数据",并且设置了进度条的宽度ncols=100bar_format参数让你可以定制进度条的格式。

bar_format 参数详解

1. {l_bar}

这个部分表示进度条的左侧区域。l_bartqdm定义的一个占位符,用来显示一些与进度相关的信息,通常包括进度条的描述、已完成的数量等。

举个例子,如果你用desc="处理数据"{l_bar}就会显示为"处理数据"。如果不指定描述,{l_bar}会保持为空。

2. {bar}

{bar}是进度条的核心部分,它表示实际的进度条图形。通常,这部分会显示一段由#字符组成的进度条,显示任务的完成比例。

比如,当任务完成50%时,{bar}会显示一半的进度条。进度条的长度和显示的字符数是自动调整的,适应不同的终端大小。

3. {n_fmt}

这个部分表示当前已经完成的任务数量,并且会格式化成你希望的样式。例如,{n_fmt}会显示“50”或“500”,表示当前完成的数量。

它会根据任务的实际进度自动更新,通常用于显示"当前进度/总进度"的形式。

4. {total_fmt}

{total_fmt}表示总的任务数量。它通常显示为任务的总数,比如“100”或“500”,表示任务的总量。

总的任务数量一般不会改变,除非任务总数被动态调整。

进度条与多线程

如果你的任务是多线程的,进度条的更新可能会有些问题。幸运的是,tqdm支持在多线程中使用进度条。这里我们需要使用tqdmconcurrent模块:

from tqdm.contrib.concurrent import thread_map
import time

def task(x):
    time.sleep(0.1)
    return x

# 使用多线程并且显示进度条
result = thread_map(task, range(100), max_workers=10)

这样,无论是单线程还是多线程,tqdm都能帮助你展示进度。

文件下载进度条

进度条不仅仅用于循环,它还能和其他功能结合使用,比如文件下载、批量处理等。

假设我们要下载一个文件,tqdm可以帮助我们展示下载进度:

import requests
from tqdm import tqdm

url = "https://example.com/largefile.zip"
response = requests.get(url, stream=True)

# 获取文件大小
file_size = int(response.headers.get('Content-Length', 0))

# 使用进度条下载文件
with open('largefile.zip', 'wb') as f, tqdm(
    desc="下载中",
    total=file_size,
    unit='B',
    unit_scale=True
) as bar:
    for chunk in response.iter_content(chunk_size=1024):
        f.write(chunk)
        bar.update(len(chunk))

在这个例子中,我们通过Content-Length获取文件大小,并用tqdm实时更新下载进度。

小结

进度条是Python中一个非常实用的工具,它不仅能让你的程序看起来更加专业,还能大大提升用户体验。今天,我们学习了如何使用tqdm库轻松地为程序添加进度条,如何自定义进度条的样式以及在多线程任务中如何使用它。

记住,进度条的作用不仅仅是展示进度,它还可以帮助你了解程序是否正常运行,什么时候任务完成,从而提升代码的可用性和用户体验。

希望今天的内容能帮助你更加轻松地使用进度条,成为一个更加细心的开发者!🎉

如果你觉得这篇文章有用,别忘了点个赞哦!更多有趣的Python技巧,敬请关注!😂