Python读取多行JSON格式txt文件报JSONDecodeError的原因及解决方法
报错根本原因
json.loads() 原生仅支持解析单个独立的合法JSON结构,传入包含多个JSON对象的拼接字符串时,解析完第一个对象后检测到剩余未解析内容,就会抛出Extra data类型的解码错误。
你的日志文件属于标准JSON Lines格式:每行是一个独立完整的JSON对象,整文件读取后得到的是N个JSON对象拼接的长字符串,不符合json.loads()的单结构输入要求,因此全量读取解析必然报错;单独截取单条内容时输入仅包含一个JSON结构,自然可以正常解析。
可行解析方案
方案1:原生模块实现(无第三方依赖,优先选用)
按行遍历文件,跳过空行后逐行解析即可,同时可以加异常捕获定位个别格式异常的脏数据:
import json all_logs = [] # 替换为你的实际文件路径,Win平台导出的日志如果utf-8解码乱码可以换成gbk编码 with open("your_win_event_log.txt", "r", encoding="utf-8") as f: for line_idx, line in enumerate(f, start=1): stripped_line = line.strip() if not stripped_line: continue try: log_item = json.loads(stripped_line) all_logs.append(log_item) except json.JSONDecodeError as err: print(f"第{line_idx}行解析异常:{err}")
不要用f.read()一次性读取全文件内容再解析,大体积日志下会占用过高内存,也不符合JSON Lines格式的解析逻辑。
方案2:专用库解析(适合超大日志文件场景)
如果日志文件体积在GB级,可以使用专门处理JSON Lines格式的第三方库,内置流式解析逻辑,内存占用更低:
- 先安装依赖:
pip install jsonlines
- 解析代码:
import jsonlines all_logs = [] with jsonlines.open("your_win_event_log.txt") as reader: for log_item in reader: all_logs.append(log_item)
常见坑点说明
- Winlogbeat正常采集落盘的每行日志都是完整合法JSON,若出现个别行解析失败,优先排查是否存在日志写入截断、换行符未转义的问题。
- 不要尝试把所有行用逗号拼接、外层包裹
[]转成JSON数组再解析,大文件下拼接字符串的内存开销极高,遇到行内本身带逗号/括号的脏数据时会直接整体解析失败,容错性极差。
内容的提问来源于stack exchange,提问作者Kristada673
相关产品推荐
相关产品推荐

