Python如何筛选日志中含begin/end的行并保存到文件
日志关键词行提取并保存到文件
需求说明
从日志文件中提取所有包含关键词begin和end的行,将筛选结果保存为新文件。
原始日志样例
19-3-2020 05:23:20.481 INFO 12 183 creating socket for traffic CONTROL module 19-3-2020 05:23:20.481 INFO 18 189 transaction 17336 begin 19-3-2020 05:23:20.622 INFO 17 194 creating mailslot for RSVP 19-3-2020 05:23:20.622 INFO 16 187 end transaction 17336 19-3-2020 05:23:20.622 INFO 13 193 transaction 17339 begin
期望输出结果
19-3-2020 05:23:20.481 INFO 18 189 transaction 17336 begin 19-3-2020 05:23:20.622 INFO 16 187 end transaction 17336 19-3-2020 05:23:20.622 INFO 13 193 transaction 17339 begin 19-3-2020 05:23:20.792 INFO 15 194 end transaction 17339
当前已有代码
现有代码已经可以在控制台正确打印筛选出的行,代码如下:
with open("exam.log", "r") as f: text = f.readlines() END = 'end' BEGIN = 'begin' for val in text: if END in val: print(val) if BEGIN in val: print(val)
实现方案
只需要在原有逻辑基础上增加文件写入操作即可,推荐使用逐行读取逐行写入的写法,内存占用更低,适配GB级大日志文件处理:
END = 'end' BEGIN = 'begin' # 同时打开源日志文件和结果输出文件 with open("exam.log", "r", encoding="utf-8") as src_file, open("filtered_result.log", "w", encoding="utf-8") as res_file: for line in src_file: # 匹配到任意一个关键词就同时输出到控制台和结果文件 if BEGIN in line or END in line: print(line.strip()) res_file.write(line)
如果是处理体积较小的日志,也可以先收集所有匹配行再一次性写入:
END = 'end' BEGIN = 'begin' matched_lines = [] with open("exam.log", "r", encoding="utf-8") as f: for line in f: if BEGIN in line or END in line: matched_lines.append(line) print(line.strip()) # 批量写入结果文件 with open("filtered_result.log", "w", encoding="utf-8") as f: f.writelines(matched_lines)
注意事项
- 打开文件时建议显式指定
encoding="utf-8",避免Windows、Linux等不同系统默认编码差异导致的乱码问题 - 原代码使用两个独立
if判断,如果某一行同时包含begin和end会被重复打印、重复写入,改用or合并判断条件可以避免这个问题 - 不需要提前调用
readlines()把整个文件加载到内存,直接遍历文件对象即可逐行读取,处理大文件时内存占用稳定
内容的提问来源于stack exchange,提问作者nati malm
相关产品推荐
相关产品推荐

