Python解析日志文件用split拆分时无法去除方括号问题求解
日志解析非正则实现问题
问题背景
需要解析固定格式的日志文件,目标是将每条日志拆分为日期、错误类型、消息三个字段,后续根据指定标识参数输出对应统计信息。出于学习目的,不使用正则表达式,仅通过Python字符串原生方法实现。
待解析日志格式如下:
[Tue Nov 06 09:41:10 2020] [type] message
初始实现代码:
for line in f.readlines(): details = line.split(']')[0], line.split(']')[1], line.split(']')[2] details = [x.strip() for x in details] structure = {key:value for key, value in zip(order, details)} data.append(structure)
运行后存在字段值残留左方括号的问题,错误输出样例:
"date": "[Tue Nov 06 09:41:10 2020", "type": "[type",
已尝试的无效方案:
- 修改拆分逻辑为
details = line.strip('[').split(']')[0], line.split(']')[1], line.split(']')[2],仅能去除日期字段前的左括号,无法处理类型字段前的左括号 - 拆分前对整行字符串执行strip操作,完全无法去除对应位置的括号
- 先后调整上百种拆分、去字符的写法,均未得到正确结果
问题原因
以]作为分割符拆分字符串时,每个被]分隔的分段,只要是被[包裹的字段,分段开头必然会携带[字符。而默认的strip()方法仅会去除字符串首尾的空白字符,不会处理字符串开头的[,仅给第一个分段单独加strip('[')自然覆盖不到第二个分段的括号。
可行实现方案
方案1:优化分割符写法(简单场景适用)
观察日志格式可以发现,两个]后方都紧跟一个空格,直接用'] '作为分割符拆分即可在拆分阶段自动去掉所有]和后方的空格,再统一给每个分段去掉开头的[即可:
for line in f.readlines(): # 先去掉行尾换行符,再按"] "拆分,直接得到三个分段 parts = line.rstrip('\n').split('] ') # 每个分段去掉开头的左括号,消息段开头无[,该操作无副作用 details = [part.lstrip('[') for part in parts] structure = dict(zip(order, details)) data.append(structure)
该写法代码最简洁,适合日志格式完全固定、消息内容不会出现'] '字符的场景。
方案2:按索引位置切片(鲁棒性更强)
如果日志消息内容可能出现[、]类字符,可以通过字符串查找方法固定定位两个括号的位置,前两个字段按括号位置切片,剩余内容全部作为消息字段,避免拆分错误:
for line in f.readlines(): line = line.rstrip('\n') # 定位第一个右括号位置,切出日期字段(左括号在索引0位置,直接从1开始切) first_close_idx = line.index(']') date = line[1:first_close_idx] # 从第一个右括号之后定位第二个左括号、右括号的位置,切出类型字段 second_open_idx = line.index('[', first_close_idx) second_close_idx = line.index(']', second_open_idx) log_type = line[second_open_idx+1:second_close_idx] # 第二个右括号之后的所有内容都属于消息,去掉前后空白即可 message = line[second_close_idx+1:].strip() structure = dict(zip(order, [date, log_type, message])) data.append(structure)
该写法不会被消息内容里的特殊括号干扰,适合生产环境使用。
内容的提问来源于stack exchange,提问作者user19281460
相关产品推荐
相关产品推荐

