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

