下面我将为你介绍几种最流行和实用的 Python 进度库,从最简单到最强大,并附上详细的代码示例。

tqdm - 最流行、最推荐的选择
tqdm 是一个快速、可扩展的 Python 进度条库,几乎成为了事实上的标准,它的名字来源于阿拉伯语 taqaddum (تقدّم),意思是“进步”。
优点:
- 简单易用: 只需一行代码即可将任何可迭代对象包装成进度条。
- 功能强大: 支持嵌套循环、多线程/多进程、Jupyter Notebook、手动控制等多种高级功能。
- 高度可定制: 可以自定义进度条的格式、字符、颜色等。
- 性能卓越: 对原有代码的性能影响极小。
安装
pip install tqdm
基本用法
a) 在普通 for 循环中使用
这是最常见的用法,只需将你的 for 循环变量用 tqdm() 包裹起来即可。

from tqdm import tqdm
import time
# 模拟一个耗时任务
data = range(100)
# 使用tqdm包装data
for i in tqdm(data, desc="Processing data"):
time.sleep(0.05) # 模拟处理每项数据需要50毫秒
运行效果会是一个动态的进度条:
Processing data: 100%|██████████| 100/100 [00:05<00:00, 19.80it/s]
100%: 当前进度百分比。- 进度条的可视化表示。
100/100: 已处理项目数 / 总项目数。[00:05<00:00]: 已用时间 / 剩余时间。80it/s: 每秒处理的迭代次数 (iterations per second)。
b) 在 while 循环中使用
对于 while 循环,你可以使用 tqdm 的手动更新模式。
from tqdm import tqdm
import time
pbar = tqdm(total=100, desc="Manual Progress")
for i in range(100):
# 你的任务代码
time.sleep(0.05)
pbar.update(1) # 每次循环手动更新进度
pbar.close() # 完成后记得关闭进度条
c) 在 Jupyter Notebook / Google Colab 中使用

tqdm 在 Jupyter 中也能完美工作,它会自动渲染成一个美观的 HTML 进度条。
# 在 Jupyter Notebook 或 Google Colab 的单元格中运行
from tqdm.notebook import tqdm
import time
for i in tqdm(range(100), desc="Notebook Progress"):
time.sleep(0.05)
rich.progress - 功能强大的现代化库
Rich 是一个功能极其丰富的 Python 库,用于在终端中创建美观的输出,它的进度条组件非常强大,支持多种布局、任务管理和动画效果。
优点:
- 视觉效果极佳: 支持彩色文本、表格、进度条等,让终端输出非常炫酷。
- 功能丰富: 内置任务管理,可以轻松处理多个并行的子任务。
- 易于集成: 与
click等命令行库集成得很好。
安装
pip install rich
基本用法
Rich 的进度条通常与 with 语句一起使用,这有助于资源的自动管理。
from rich.progress import Progress
import time
# 模拟多个任务
tasks = ["Downloading...", "Processing...", "Compiling..."]
with Progress() as progress:
# 为每个任务添加一个进度条
for task_description in tasks:
task = progress.add_task(f"[cyan]{task_description}", total=100)
# 模拟任务执行
for i in range(100):
time.sleep(0.02)
progress.update(task, advance=1) # 更新进度
运行效果会是一个包含多个进度条和统计信息的漂亮界面。
click.progressbar - 专为命令行应用设计
如果你在使用 click 库来构建命令行工具,click.progressbar 是最佳选择,因为它与 click 的集成是无缝的。
优点:
- 无缝集成: 与
click的上下文和参数完美配合。 - 简洁: API 设计符合
click的风格。 - 一致性: 保持了
click应用的整体风格。
安装
pip install click
基本用法
import click
import time
import sys
@click.command()
@click.option('--count', default=100, help='Number of items to process.')
def process_items(count):
"""A simple command line tool with a progress bar."""
with click.progressbar(range(count), label='Processing items') as bar:
for item in bar:
# 模拟处理过程
time.sleep(0.05)
# bar.is_printable 可以判断当前是否应该打印进度
if not bar.is_printable:
# 如果输出被重定向(例如到文件),可以只打印最终结果
click.echo(f"Processed item {item}", file=sys.stderr)
click.echo("All done!")
if __name__ == '__main__':
process_items()
内置的 print + \r - 最基础的手动方法
如果你不想安装任何第三方库,也可以用最原始的方式实现一个简单的进度条,这能帮助你理解进度条背后的基本原理。
原理:
\r(回车符): 将光标移动到当前行的开头,这样下一次print就会覆盖掉上一次的内容。end='': 防止print函数在末尾添加换行符。
import time
total = 100
for i in range(total + 1):
# 构建进度条字符串
progress = f"Processing: [{'#' * i}{'-' * (total - i)}] {i}/{total}"
# 使用 \r 回到行首,并 flush=True 确保立即输出
print(progress, end='\r', flush=True)
time.sleep(0.05)
# 循环结束后打印一个换行符,以免影响后续输出
print("\nDone!")
缺点:
- 功能非常有限,不支持多任务、时间估算等。
- 在某些环境(如某些IDE)下,
\r可能无法正常工作。 - 代码不够优雅,容易出错。
总结与如何选择
| 库 | 优点 | 缺点 | 最佳使用场景 |
|---|---|---|---|
tqdm |
简单、快速、功能全面、社区标准 | 默认样式较朴素 | 绝大多数情况下的首选,脚本、数据分析、机器训练等。 |
rich.progress |
视觉效果极佳、功能强大、支持多任务 | 依赖 rich 库,比 tqdm 稍重 |
追求炫酷终端体验的应用、需要复杂进度管理的工具。 |
click.progressbar |
与 click 无缝集成、简洁 |
仅适用于 click 项目 |
正在使用 click 构建命令行工具的开发者。 |
print + \r |
无依赖、轻量 | 功能简陋、环境兼容性差、不易维护 | 学习目的、或在一个极简的、不能安装任何依赖的脚本中临时使用。 |
我的建议:
- 如果你是初学者或只是想在脚本中加个进度条:直接使用
tqdm,它是最简单、最可靠的选择。 - 如果你在开发一个命令行工具,并且已经在用
click:使用click.progressbar。 - 如果你想让你的命令行工具看起来非常专业和炫酷:使用
rich.progress。 - 如果你只是想了解一下进度条是怎么工作的:尝试一下
print+\r的方法。
