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

如何让tqdm进度条的多组统计信息换行显示且仅实时更新数值不重复打印新行

如何让tqdm进度条的多组统计信息换行显示且仅实时更新数值不重复打印新行

我太懂你想要的效果了:进度条稳稳顶在上方,统计信息单独占下面一行,数值实时刷新但绝不刷屏,不会每次都冒出新行。之前你直接加\n导致刷屏的问题很常见,这里有两种靠谱的解决方法,你可以按需选择:

方法一:让tqdm自动根据屏幕宽度换行(快速省心)

这个方法不需要你手动控制行数,tqdm会自动根据终端宽度把过长的描述内容换到下一行,更新时只会刷新现有内容,不会新增行,速度还挺快。直接复制下面的代码就能用:

import numpy as np
from tqdm import tqdm
import time

tot_steps = 100
# 调整bar_format,把统计描述放在进度条信息的最后,tqdm会自动换行
pbar = tqdm(
    total=tot_steps,
    bar_format='{l_bar}{bar}| {n_fmt}/{total_fmt} [{elapsed}<{remaining}, {rate_fmt}] {desc}'
)

for i in range(tot_steps):
    time.sleep(0.1)
    x, y, z, k = np.random.rand(4)
    # 设置描述内容,refresh=False优化刷新性能
    pbar.set_description(
        f"error[{x:.3f}] samples[{y:.3f}] min[{z:.3f}] max[{k:.3f}]",
        refresh=False
    )
    pbar.update(1)
pbar.close()

这个方法的优点是零心智负担,tqdm帮你搞定所有换行逻辑;唯一的小缺点是你没法精确控制统计信息占几行,完全由当前终端的屏幕宽度决定。

方法二:手动控制统计信息在新行(灵活可控)

如果你想完全掌控统计信息的位置(比如固定在进度条下方第一行),可以用终端光标控制结合tqdm来实现——这也是你提到的已采纳的nischal答案的核心思路。核心是每次更新统计信息时,先回到上一行覆盖原有内容,而不是输出新行:

import numpy as np
from tqdm import tqdm
import time
import sys

tot_steps = 100
pbar = tqdm(total=tot_steps)

# 先打印一个空行,预留统计信息的位置
print()

for i in range(tot_steps):
    time.sleep(0.1)
    x, y, z, k = np.random.rand(4)
    stats_str = f"error[{x:.3f}] samples[{y:.3f}] min[{z:.3f}] max[{k:.3f}]"
    
    # 光标控制:先回到上一行开头,再覆盖原有内容
    sys.stdout.write("\033[F")  # 光标上移一行
    sys.stdout.write("\r")      # 光标回到行首
    print(stats_str)
    
    pbar.update(1)
pbar.close()

这个方法的好处是你想把统计信息放在哪都行,完全灵活;但需要手动处理终端光标控制符,代码稍微复杂一丢丢,速度比自动换行的方法慢一点点,但日常使用完全感知不到差异。

避坑提醒

千万不要直接在set_description里加\n,那样会触发tqdm每次更新都输出新行,反而会刷屏——这也是你之前踩过的坑,一定要避开!

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.08 11:10:28