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

如何让Python库tqdm将进度信息写入日志文件?

用tqdm实现日志友好的进度输出

无需自行实现迭代器,tqdm本身支持配置输出到日志文件,以下是两种可靠的官方方案:

方案一:定向tqdm输出到日志流

通过tqdm的file参数将进度输出直接写入日志,同时关闭动态重绘以适配日志的追加模式:

import logging
from tqdm import tqdm
import time

# 初始化日志配置
logging.basicConfig(
    level=logging.INFO,
    format='%(asctime)s - %(levelname)s - %(message)s',
    filename='task_progress.log'
)
logger = logging.getLogger(__name__)

# 获取日志输出流(适配不同日志处理器)
log_stream = None
for handler in logger.handlers:
    if hasattr(handler, 'stream'):
        log_stream = handler.stream
        break
if not log_stream:
    log_stream = open('task_progress.log', 'a')

# 迭代时使用tqdm并定向到日志
for item in tqdm(
    range(100),
    file=log_stream,
    dynamic_ncols=False,
    leave=False,
    bar_format='进度:{n_fmt}/{total_fmt} | 已耗时:{elapsed} | 剩余:{remaining} | 速度:{rate_fmt}',
    mininterval=3  # 每3秒输出一次进度
):
    time.sleep(0.1)

方案二:自定义日志内容格式

利用tqdm实例的内置属性,手动将进度数据写入日志,完全控制输出内容:

import logging
from tqdm import tqdm
import time

logging.basicConfig(
    level=logging.INFO,
    format='%(asctime)s - %(levelname)s - %(message)s',
    filename='task_progress.log'
)
logger = logging.getLogger(__name__)

total_items = 100
with tqdm(total=total_items) as pbar:
    for _ in range(total_items):
        time.sleep(0.1)
        pbar.update(1)
        # 每处理10个条目或间隔5秒输出一次日志
        if pbar.n % 10 == 0 or (time.time() - (pbar.last_print_t or 0)) > 5:
            logger.info(
                "已处理%d/%d条(%.1f%%),耗时%.1fs,剩余%.1fs,单条耗时%.1fs",
                pbar.n,
                pbar.total,
                pbar.n / pbar.total * 100,
                pbar.elapsed,
                pbar.remaining,
                pbar.avg_time
            )
            pbar.last_print_t = time.time()

核心优势

  • 基于tqdm官方API实现,避免自定义迭代器的代码冗余和潜在问题
  • 可灵活控制日志输出频率和格式,适配不同场景需求
  • 保留tqdm的所有内置计算(如剩余时间、平均速度),无需手动实现

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 21:25:24