You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 18:18:39