Python处理日志转字典列表时出现list index out of range报错求解
问题解决方法
报错原因
- 代码中for循环存在缩进错误,不属于嵌套代码块的内容多了前置缩进,首先会触发语法错误
- 直接按空白符分割日志行的逻辑不可靠:如果存在空行、行首尾有空白、或者字段内隐含空白的情况,split得到的列表长度会不足8个元素,访问
temp[5]/temp[6]/temp[7]就会触发list index out of range错误 - 原有逻辑没有处理原始字段自带的方括号、双引号,生成的字典格式和要求不符
修正代码
推荐直接用正则捕获组匹配单条日志的所有字段,逻辑更稳定,适配性更强:
import re def logs(): with open("logdata.txt", "r") as file: logdata = file.read() return logdata # 正则分组匹配四个所需字段,自动过滤空行和格式异常的行 pattern = re.compile(r'(?P<host>\S+)\s+-\s+(?P<user_name>\S+)\s+\[(?P<time>[^\]]+)\]\s+"(?P<request>[^"]+)"') final_list = [] all_data = logs().splitlines() for line in all_data: match = pattern.match(line.strip()) if match: final_list.append(match.groupdict()) print(final_list)
代码说明
- 正则表达式直接按日志的标准格式分组捕获四个字段,只有格式匹配的行才会被处理,不会出现索引越界问题
- 捕获时直接去掉了时间字段外层的方括号、请求字段外层的双引号,生成的字典完全符合要求的格式
- 用
splitlines()替代自定义的换行分割,适配不同操作系统的换行符格式
内容的提问来源于stack exchange,提问作者Mohamed Gamal
相关产品推荐
相关产品推荐

