🎬 HoRain云小助手个人主页

 🔥 个人专栏: 《Linux 系列教程》《c语言教程

⛺️生活的理想,就是为了理想的生活!


⛳️ 推荐

前些天发现了一个超棒的服务器购买网站,性价比超高,大内存超划算!忍不住分享一下给大家。点击跳转到网站。

专栏介绍

专栏名称

专栏介绍

《C语言》

本专栏主要撰写C干货内容和编程技巧,让大家从底层了解C,把更多的知识由抽象到简单通俗易懂。

《网络协议》

本专栏主要是注重从底层来给大家一步步剖析网络协议的奥秘,一起解密网络协议在运行中协议的基本运行机制!

《docker容器精解篇》

全面深入解析 docker 容器,从基础到进阶,涵盖原理、操作、实践案例,助您精通 docker。

《linux系列》

本专栏主要撰写Linux干货内容,从基础到进阶,知识由抽象到简单通俗易懂,帮你从新手小白到扫地僧。

《python 系列》

本专栏着重撰写Python相关的干货内容与编程技巧,助力大家从底层去认识Python,将更多复杂的知识由抽象转化为简单易懂的内容。

《试题库》

本专栏主要是发布一些考试和练习题库(涵盖软考、HCIE、HRCE、CCNA等)

目录

⛳️ 推荐

专栏介绍

💡 第三方库推荐

tqdm

alive-progress

rich

🛠️ 手动实现基础进度条

💻 图形界面进度条

📊 常见应用场景

如何选择?


img

在Python中为耗时操作添加进度条可以有效提升用户体验。下面我将介绍几种主流的实现方法,包括推荐的第三方库和手动实现方式。

下表快速对比了几个主流的进度条库:

库名

主要特点

适用场景

安装命令

tqdm

简单高效,生态强大,文档丰富

绝大多数循环迭代场景,是首选方案

pip install tqdm

alive-progress

动态效果丰富,视觉效果酷炫

终端交互、演示或需要更生动反馈的场景

pip install alive-progress

rich

功能全面,可美化终端整体输出

复杂的CLI工具,当进度条只是需求之一时

pip install rich

💡 第三方库推荐

tqdm

tqdm是Python社区最流行、最易用的进度条库。

基本使用:只需用 tqdm()包装任何可迭代对象即可。

from tqdm import tqdm
import time

for i in tqdm(range(100)):
    time.sleep(0.01)  # 模拟耗时任务

高级功能tqdm功能非常丰富。

  • 自定义描述和样式:通过参数设置前缀、进度条长度等。

    for i in tqdm(range(100), desc="处理中", ncols=80, bar_format="{l_bar}{bar}| {n_fmt}/{total_fmt}"):
        time.sleep(0.01)
  • 与Pandas等库结合:为pandasapply操作添加进度条。

    import pandas as pd
    from tqdm import tqdm
    tqdm.pandas()  # 激活tqdm for pandas
    df['new_col'] = df['col'].progress_apply(lambda x: x**2)
alive-progress

如果你追求更动态、美观的进度条,alive-progress是个不错的选择。

from alive_progress import alive_bar
import time

with alive_bar(100, title='Processing') as bar:  # 使用上下文管理器
    for i in range(100):
        time.sleep(0.01)
        bar()  # 每次迭代后更新进度条
rich

如果您的项目除了进度条,还需要输出彩色文本、表格、日志等富文本内容,rich.progress模块是理想选择。

from rich.progress import Progress
import time

with Progress() as progress:  # 支持多个并发任务
    task1 = progress.add_task("[red]Downloading...", total=100)
    task2 = progress.add_task("[green]Processing...", total=200)
    
    while not progress.finished:
        progress.update(task1, advance=0.9)
        progress.update(task2, advance=0.5)
        time.sleep(0.1)

🛠️ 手动实现基础进度条

理解其原理有助于更好地自定义。以下是一个基础的手动实现版本:

import sys
import time

def print_progress_bar(iteration, total, prefix='', suffix='', decimals=1, length=50, fill='█'):
    """
    调用示例:
    for i in range(total):
        time.sleep(0.1)
        print_progress_bar(i + 1, total, prefix='进度:', suffix='完成', length=50)
    """
    percent = ("{0:." + str(decimals) + "f}").format(100 * (iteration / float(total)))
    filled_length = int(length * iteration // total)
    bar = fill * filled_length + '-' * (length - filled_length)
    # 使用'\r'将光标移回行首,实现原地更新
    sys.stdout.write(f'\r{prefix} |{bar}| {percent}% {suffix}')
    sys.stdout.flush()
    
    # 当任务完成时,打印一个换行符
    if iteration == total:
        print()

# 使用示例
total = 100
for i in range(total):
    time.sleep(0.1)  # 模拟耗时任务
    print_progress_bar(i + 1, total, prefix='进度:', suffix='完成', length=50)

💻 图形界面进度条

对于GUI应用程序,可以使用相应的GUI工具包创建进度条。

使用Tkinter(标准库)示例

import tkinter as tk
from tkinter import ttk
import threading
import time

def start_progress():
    for i in range(101):
        time.sleep(0.1)
        progress_var.set(i)  # 更新进度值
        root.update_idletasks()  # 更新GUI

root = tk.Tk()
progress_var = tk.IntVar()
progress_bar = ttk.Progressbar(root, variable=progress_var, maximum=100)
progress_bar.pack()
start_button = tk.Button(root, text="开始", command=lambda: threading.Thread(target=start_progress).start())
start_button.pack()
root.mainloop()

📊 常见应用场景

  • 文件下载/上传:结合requests库,在下载数据块时更新进度。

  • 数据处理:在处理大型数据集(如使用Pandas)时显示进度。

  • 模型训练:在机器学习的训练循环中显示每个epoch的进度。

如何选择?

  • 追求简单高效:直接使用 tqdm,它几乎能满足所有常规需求。

  • 需要酷炫动画:尝试 alive-progress

  • 开发复杂命令行工具:考虑 rich,它能让你的终端输出整体提升一个档次。

  • 在GUI应用中:使用对应GUI框架(如Tkinter、PyQt)提供的进度条组件。

希望这些信息能帮助您为Python项目选择合适的进度条方案。如果您有特定的使用场景,比如是在Jupyter Notebook中还是处理多任务,我可以提供更具体的建议。

❤️❤️❤️本人水平有限,如有纰漏,欢迎各位大佬评论批评指正!😄😄😄

💘💘💘如果觉得这篇文对你有帮助的话,也请给个点赞、收藏下吧,非常感谢!👍 👍 👍

🔥🔥🔥Stay Hungry Stay Foolish 道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐