如何让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
相关产品推荐
相关产品推荐

