杰瑞科技汇

python使用progressbar

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

python使用progressbar-图1
(图片来源网络,侵删)

tqdm - 最流行、最推荐的选择

tqdm 是一个快速、可扩展的 Python 进度条库,几乎成为了事实上的标准,它的名字来源于阿拉伯语 taqaddum (تقدّم),意思是“进步”。

优点:

  • 简单易用: 只需一行代码即可将任何可迭代对象包装成进度条。
  • 功能强大: 支持嵌套循环、多线程/多进程、Jupyter Notebook、手动控制等多种高级功能。
  • 高度可定制: 可以自定义进度条的格式、字符、颜色等。
  • 性能卓越: 对原有代码的性能影响极小。

安装

pip install tqdm

基本用法

a) 在普通 for 循环中使用

这是最常见的用法,只需将你的 for 循环变量用 tqdm() 包裹起来即可。

python使用progressbar-图2
(图片来源网络,侵删)
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 中使用

python使用progressbar-图3
(图片来源网络,侵删)

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 的方法。
分享:
扫描分享到社交APP
上一篇
下一篇