Python 进度条

在 Python 中,创建进度条是可视化任务进度的一种常用方式,特别适合长时间运行的任务(如文件处理、数据下载或循环操作)。最常用的库是 tqdm,它简单易用,支持命令行和 Jupyter Notebook 环境。以下是一个关于 Python 进度条的教程,重点介绍 tqdm,并提供其他替代方法。


一、使用 tqdm 创建进度条

1. 安装 tqdm

运行以下命令安装 tqdm

pip install tqdm

2. 基本用法

tqdm 可以轻松包装任何可迭代对象(如列表、范围)以显示进度条。

示例:基本进度条

from tqdm import tqdm
import time

# 模拟一个耗时任务
for i in tqdm(range(100)):
    time.sleep(0.1)  # 模拟工作

输出(终端中显示动态进度条):

100%|██████████| 100/100 [00:10<00:00, 10.00it/s]
  • 100%:任务完成百分比。
  • 100/100:当前进度/总任务量。
  • [00:10<00:00, 10.00it/s]:已用时间、剩余时间、每秒迭代次数。

3. 自定义进度条

tqdm 支持多种自定义选项,如描述、单位、进度条样式等。

示例:自定义描述和单位

from tqdm import tqdm
import time

for i in tqdm(range(100), desc="Processing", unit="item"):
    time.sleep(0.1)

输出

Processing: 100%|██████████| 100/100 [00:10<00:00, 10.00item/s]

4. 手动控制进度条

如果任务不是基于迭代,可以手动更新进度条。

示例:手动更新

from tqdm import tqdm
import time

pbar = tqdm(total=100, desc="Manual Update")
for i in range(10):
    time.sleep(0.5)
    pbar.update(10)  # 每次更新 10%
pbar.close()

输出

Manual Update: 100%|██████████| 100/100 [00:05<00:00, 20.00it/s]

5. 在嵌套循环中使用

tqdm 支持嵌套进度条,适合多层循环。

示例:嵌套进度条

from tqdm import tqdm
import time

for i in tqdm(range(5), desc="Outer"):
    for j in tqdm(range(100), desc="Inner", leave=False):
        time.sleep(0.01)
  • leave=False:内层循环完成后不保留进度条。

二、结合 REST API 和 Cron

如果你正在开发 REST API(例如上文提到的用户管理 API),可以用 tqdm 监控批量操作的进度。例如,处理大量用户数据的脚本:

示例:批量处理 API 数据

import requests
from tqdm import tqdm
import time

# 模拟从 REST API 获取用户数据并处理
users = [{"id": i, "name": f"User {i}"} for i in range(100)]
for user in tqdm(users, desc="Processing Users"):
    # 模拟 API 调用
    response = requests.get(f"http://localhost:3000/users/{user['id']}")
    time.sleep(0.1)  # 模拟处理时间
    print(f"Processed {user['name']}: {response.status_code}")

结合 Cron
将上述脚本保存为 process_users.py,然后通过 Linux Cron 定时运行:

crontab -e

添加:

0 3 * * * /usr/bin/python3 /path/to/process_users.py >> /var/log/process_users.log 2>&1

这会在每天凌晨 3:00 运行脚本,并显示进度条(日志中记录文本形式的进度)。


三、其他进度条库

虽然 tqdm 是最流行的选择,但以下是一些替代方案:

  1. progress(简单、轻量)
   pip install progress

示例

   from progress.bar import Bar
   import time

   bar = Bar('Processing', max=100)
   for i in range(100):
       time.sleep(0.1)
       bar.next()
   bar.finish()
  1. alive-progress(支持动画效果)
   pip install 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.1)
           bar()
  1. 自定义进度条(不依赖库)
    如果不想使用外部库,可以用 print 实现简单进度条:
   import sys
   import time

   total = 100
   for i in range(total + 1):
       progress = i / total
       bar = '#' * int(progress * 20) + '-' * (20 - int(progress * 20))
       sys.stdout.write(f'\r[{bar}] {progress*100:.1f}%')
       sys.stdout.flush()
       time.sleep(0.1)
   print()

四、调试与 console.log

在 Python 中,print 类似于 JavaScript 的 console.log()。结合进度条调试 REST API 调用:

from tqdm import tqdm
import requests

users = range(100)
for i in tqdm(users, desc="Fetching Users"):
    response = requests.get(f"http://localhost:3000/users/{i}")
    print(f"User {i} status: {response.status_code}")  # 类似 console.log

五、注意事项

  1. 性能:进度条会略微增加开销,避免在高性能场景下频繁更新。
  2. 终端兼容性tqdm 在某些非交互式终端(如 Cron 运行时)可能只输出文本日志。使用 tqdm.auto 模块自动适配:
   from tqdm.auto import tqdm
  1. 日志重定向:如果输出到文件,确保使用 tqdm.write() 避免进度条干扰:
   from tqdm import tqdm, trange

   for i in trange(100, desc="Processing"):
       tqdm.write(f"Log message for step {i}")
       time.sleep(0.1)

六、总结

  • tqdm 是 Python 中创建进度条的最佳选择,简单、灵活,支持自定义和嵌套。
  • 可以结合 REST API 批量处理数据,或通过 Cron 定时运行脚本。
  • 替代方案如 progressalive-progress 适合特定场景,自定义进度条适用于轻量需求。
  • 使用 print 进行调试,类似 JavaScript 的 console.log()

如果需要更复杂的进度条样式、结合特定 REST API 的示例,或其他 Python 相关帮助,请告诉我!

类似文章

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注