You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python自定义tqdm进度条:优化已完成数值的小数显示

解决tqdm进度条动态格式化问题

针对你需要将进度条显示从10000.000000001317/10000改为未完成时保留两位小数、完成时显示整数的需求,提供两种可行解决方案:

方案一:自定义bar_format + 动态设置格式化字段

利用tqdm允许向进度条对象添加自定义属性的特性,结合bar_format引用该属性实现动态格式切换:

from tqdm import tqdm
import time

total = 10000

# 自定义进度条格式,引用后续设置的n_formatted变量
bar_format = "{percentage:3.0f}%|{bar}| {n_formatted}/{total} [{elapsed}<{remaining}, {rate_fmt}]"

with tqdm(total=total, bar_format=bar_format) as pbar:
    for i in range(total):
        # 模拟浮点数类型的当前进度(匹配你的场景)
        current_n = i + 1 + 1.317e-9 if i < total - 1 else total
        pbar.n = current_n
        
        # 处理浮点数精度,动态切换格式
        if abs(current_n - total) < 1e-9:
            pbar.n_formatted = f"{int(current_n)}"
        else:
            pbar.n_formatted = f"{current_n:.2f}"
        
        pbar.refresh()
        time.sleep(0.0001)  # 模拟任务耗时

方案二:用set_description替代默认进度显示

修改bar_format去掉默认的{n}/{total},转而在set_description中动态生成格式化后的进度文本,避免重复显示:

from tqdm import tqdm
import time

total = 10000

# 自定义格式,移除默认的n/total显示,改用desc字段展示自定义内容
bar_format = "{desc}{bar} [{elapsed}<{remaining}, {rate_fmt}]"

with tqdm(total=total, bar_format=bar_format) as pbar:
    for i in range(total):
        current_n = i + 1 + 1.317e-9 if i < total - 1 else total
        pbar.n = current_n
        
        # 生成动态格式化的进度文本
        if abs(current_n - total) < 1e-9:
            progress_str = f"{int(current_n)}/{total} | "
        else:
            progress_str = f"{current_n:.2f}/{total} | "
        
        pbar.set_description(progress_str)
        pbar.refresh()
        time.sleep(0.0001)

为什么之前的方法失败?

  1. 直接设置n_fmt=".2f":该参数是全局格式化规则,无法根据进度是否完成切换格式,且完成时会显示10000.00/10000,不符合需求;若tqdm内部对整数/浮点数处理逻辑冲突,还会触发报错。
  2. 使用set_description出现重复:因为你未修改默认bar_format,默认格式已包含{n}/{total},叠加set_description的内容就会重复显示。

内容的提问来源于stack exchange,提问作者Daakmon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 16:16:05