1. 日志数据清洗实战:5道Python专项训练题解析
日志处理是每个开发者必须掌握的核心技能之一。在实际项目中,我们经常需要从杂乱的日志文件中提取关键信息、分析系统状态或排查问题。今天我将通过5道由浅入深的Python练习题,带你系统掌握日志数据清洗的常见场景和解决方案。
1.1 日志数据样本分析
我们先来看这个模拟的日志文件示例(log_data.txt),它包含了典型的脏数据特征:
code复制2025-05-20 08:30:15 | INFO | user_module | 用户张三登录成功
2025-05-20 09:15:22 | ERROR | order_module | 订单创建失败:参数缺失
2025-05-20 10:05:08 | WARN | pay_module | 支付超时(用户ID:10086)
2025-05-20 11:20:45 | INFO | goods_module | 商品ID:789 库存更新成功
观察这些日志可以发现几个典型问题:
- 模块名前后存在冗余空格(如
pay_module) - 日志级别大小写不统一(虽然这个样本中已经统一)
- 中文标点符号混用(冒号":"和破折号"—")
- 关键信息(如ID)嵌入在自由文本中
1.2 基础空格清洗实现
第一个题目要求我们清洗模块名前后的冗余空格。这是日志处理中最基础但非常重要的操作。
python复制def clean_space(filepath, filepath2):
with open(filepath, mode="r", encoding="utf-8") as f:
lst = f.readlines()
new_lst = []
for line in lst:
new_line = line.split("|")
new_line[2] = new_line[2].strip()
joined_line = "|".join(new_line)
new_lst.append(joined_line)
with open(filepath2,'w',encoding='utf-8') as f:
for line2 in new_lst:
f.write(line2)
print(f"清洗已完成,{filepath2}已创建")
这段代码有几个关键点需要注意:
- 使用
split("|")按分隔符拆分每行日志 - 对模块名列(索引2)单独使用
strip()处理 - 处理完成后用
join()重新拼接 - 使用UTF-8编码确保中文处理正确
提示:在实际项目中,建议添加异常处理(try-catch)来应对文件不存在或编码错误等情况。
1.3 ERROR日志筛选技巧
第二个题目要求提取所有ERROR级别的日志。这在日
