Rich项目中的进度条功能详解
概述
Rich是一个强大的Python终端格式化工具库,其中的进度条功能(Progress Display)能够优雅地展示长时间运行任务的进度信息。本文将全面介绍Rich库中进度条功能的使用方法和高级特性。
基本功能
Rich的进度条功能可以显示持续更新的任务进度信息,默认情况下会显示:
- 任务描述
- 进度条
- 完成百分比
- 预计剩余时间
该功能支持多任务并行显示,每个任务都有独立的进度条和信息展示,非常适合用于跟踪线程或进程中的并发任务。
基础用法
最简单的使用方式是调用track函数,它接受一个序列(如列表或range对象)和可选的描述信息。track函数会在每次迭代时更新进度信息。
import time
from rich.progress import track
for i in track(range(20), description="Processing..."):
time.sleep(1) # 模拟工作耗时
高级用法
对于更复杂的需求,可以直接使用Progress类。这个类设计为上下文管理器,能够自动管理进度条的启动和停止。
多任务示例
import time
from rich.progress import Progress
with Progress() as progress:
task1 = progress.add_task("[red]下载中...", total=1000)
task2 = progress.add_task("[green]处理中...", total=1000)
task3 = progress.add_task("[cyan]烹饪中...", total=1000)
while not progress.finished:
progress.update(task1, advance=0.5)
progress.update(task2, advance=0.3)
progress.update(task3, advance=0.9)
time.sleep(0.02)
这里的total参数表示任务完成需要的总步数,步数可以是任意对应用有意义的单位,如文件读取的字节数或处理的图片数量。
手动控制生命周期
如果不使用上下文管理器,需要手动调用start()和stop()方法:
progress = Progress()
progress.start()
try:
# 添加任务和更新逻辑
finally:
progress.stop()
进度条类型
瞬态进度条
设置transient=True可以使进度条在完成后自动消失:
with Progress(transient=True) as progress:
task = progress.add_task("工作中", total=100)
do_work(task)
不确定进度条
当无法预知总步数时,可以使用不确定进度条:
task = progress.add_task("等待中", total=None) # 显示脉冲动画
# 当知道总步数后
progress.start_task(task)
progress.update(task, total=known_total)
自定义显示
刷新频率
默认每秒刷新10次,可通过refresh_per_second调整:
Progress(refresh_per_second=5) # 降低刷新频率
列布局
可以完全自定义进度条显示的列:
progress = Progress(
TextColumn("[progress.description]{task.description}"),
BarColumn(),
TaskProgressColumn(),
TimeRemainingColumn(),
)
Rich提供了多种预定义的列类型:
BarColumn: 进度条TextColumn: 文本显示TimeElapsedColumn: 已用时间TimeRemainingColumn: 剩余时间MofNCompleteColumn: 完成计数(如"50/100")FileSizeColumn: 文件大小显示SpinnerColumn: 旋转动画- 等等...
表格列布局
可以通过table_column参数精细控制各列宽度比例:
text_column = TextColumn("{task.description}", table_column=Column(ratio=1))
bar_column = BarColumn(bar_width=None, table_column=Column(ratio=2))
progress = Progress(text_column, bar_column, expand=True)
实用功能
文件读取进度
Rich提供了便捷的文件读取进度显示:
import json
from rich.progress import open
with open("data.json", "rb") as file:
data = json.load(file)
对于已有的文件对象,可以使用wrap_file:
from rich.progress import wrap_file
with wrap_file(existing_file, size) as file:
data = file.read()
打印输出
在进度条运行时打印信息:
with Progress() as progress:
task = progress.add_task("工作中", total=10)
for job in range(10):
progress.console.print(f"处理任务 #{job}")
run_job(job)
progress.advance(task)
总结
Rich的进度条功能提供了从简单到复杂的各种使用场景支持,无论是单任务还是多任务,确定进度还是不确定进度,都能以优雅的方式展示。通过灵活的列配置和丰富的预定义组件,可以创建出满足各种需求的进度显示效果。
对于需要更复杂场景的开发者,还可以通过继承Progress类并重写get_renderables方法来实现完全自定义的进度显示效果。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



