如何用Excel、Pandas构建有效日志系统?程序更新日志遇阻求助
解决方案:更新结构化运行日志并修复DataFrame拼接问题
一、修复日志更新代码问题
你当前的代码仅尝试拼接Run_ID列,既忽略了日志中其他必填字段(如请求时间、请求者等),还会因列长度不匹配导致DataFrame无变化。正确做法是构造完整的新记录行,再合并到原日志DataFrame中:
步骤1:构造新的运行记录
先为新的ResponseId补充完整日志字段(比如用当前时间填充请求时间、指定请求者邮箱等):
import pandas as pd from datetime import datetime # 读取原日志和新请求文件 log = pd.read_excel('run_log.xlsx') new_run_requests = pd.read_csv('Run+Request+Sheet_September+6,+2022_14.28.csv') # 获取当前时间,拆分日期和时间(匹配原日志格式) current_datetime = datetime.now() request_date = current_datetime.strftime('%m/%d/%Y') request_time = current_datetime.strftime('%H%M') # 构造新记录DataFrame,严格匹配原日志列结构 new_records = pd.DataFrame({ 'Run_ID': new_run_requests['ResponseId'], 'Date_Requested': request_date, 'Time_Requested': request_time, 'Requestor': 'actual_requestor@example.com', # 替换为实际请求者邮箱 'Date_Completed': None, 'Time_Completed': None })
步骤2:合并原日志与新记录
使用pd.concat合并整个DataFrame,而非单独修改某一列:
# 合并原日志和新记录,重置索引 updated_log = pd.concat([log, new_records], ignore_index=True) # 去重(避免重复添加同一Run_ID) updated_log = updated_log.drop_duplicates(subset='Run_ID', keep='first') # 保存回Excel文件 updated_log.to_excel('run_log.xlsx', index=False)
二、结构化日志的替代方案
你提到logging模块似乎不满足需求,其实它可以通过自定义配置实现结构化日志,同时还有其他更适配的方案:
1. 优化使用logging模块
通过dictConfig配置日志输出为JSON格式,方便后续解析为DataFrame:
import logging import json from datetime import datetime class StructuredFormatter(logging.Formatter): def format(self, record): log_record = { 'Run_ID': getattr(record, 'run_id', 'unknown'), 'Date_Requested': datetime.now().strftime('%m/%d/%Y'), 'Time_Requested': datetime.now().strftime('%H%M'), 'Requestor': getattr(record, 'requestor', 'unknown'), 'Date_Completed': getattr(record, 'date_completed', None), 'Time_Completed': getattr(record, 'time_completed', None) } return json.dumps(log_record) # 配置日志 logging.basicConfig(level=logging.INFO) handler = logging.FileHandler('structured_log.json') handler.setFormatter(StructuredFormatter()) logger = logging.getLogger('run_logger') logger.addHandler(handler) # 记录日志 logger.info('New run initiated', extra={'run_id': 'R_jals893', 'requestor': 'email@email.com'})
后续可通过pd.read_json读取JSON日志,转换为DataFrame处理。
2. 使用SQLite数据库
如果日志量较大,SQLite比Excel/CSV更高效,支持查询、去重、更新等操作:
import sqlite3 from datetime import datetime conn = sqlite3.connect('run_log.db') cursor = conn.cursor() # 首次运行创建日志表 cursor.execute(''' CREATE TABLE IF NOT EXISTS run_log ( Run_ID TEXT PRIMARY KEY, Date_Requested TEXT, Time_Requested TEXT, Requestor TEXT, Date_Completed TEXT, Time_Completed TEXT ) ''') # 插入新记录(忽略已存在的Run_ID) current_datetime = datetime.now() run_id = 'R_jals893' cursor.execute(''' INSERT OR IGNORE INTO run_log (Run_ID, Date_Requested, Time_Requested, Requestor) VALUES (?, ?, ?, ?) ''', (run_id, current_datetime.strftime('%m/%d/%Y'), current_datetime.strftime('%H%M'), 'email@email.com')) conn.commit() conn.close()
3. 继续使用Excel/CSV(小体量日志场景)
即前面提到的pandas方案,操作简单直观,适合日志量不大的场景。
内容的提问来源于stack exchange,提问作者a tired engineer
相关产品推荐
相关产品推荐

