Python 解析并grep包含JSON格式条目的日志文件

Python 解析并grep包含JSON格式条目的日志文件,python,json,Python,Json,我想解析pilight的日志。它有多个JSON条目,大部分是datetime条目,而不是单个JSON字符串。因此,当我使用json.load(f)时,我得到一个错误 json.decoder.JSONDecodeError:额外数据:第12行第1列(字符171) 下面是示例文件。如何解析这样的文件 我想做的是抑制包含“protocol”:“datetime”的完整JSON条目,但将第一个条目保留在不是datetime的完整JSON条目之后 因此,我将得到一个新的简化日志文件,其中包含“messa

我想解析pilight的日志。它有多个JSON条目,大部分是datetime条目,而不是单个JSON字符串。因此,当我使用
json.load(f)
时,我得到一个错误

json.decoder.JSONDecodeError:额外数据:第12行第1列(字符171)

下面是示例文件。如何解析这样的文件

我想做的是抑制包含
“protocol”:“datetime”
的完整JSON条目,但将第一个条目保留在不是datetime的完整JSON条目之后

因此,我将得到一个新的简化日志文件,其中包含“messages”,后跟一个“datetime”部分。在本例中,该文件仅包含前2个JSON条目

{
    "message": {
        "id": 31,
        "unit": 15,
        "state": "down"
    },
    "origin": "receiver",
    "protocol": "arctech_screen_old",
    "uuid": "0000-b8-27-eb-e85eff",
    "repeats": 1
}
{
    "origin": "receiver",
    "protocol": "datetime",
    "message": {
        "longitude": 9.000000,
        "latitude": 44.633000,
        "year": 2020,
        "month": 6,
        "day": 5,
        "weekday": 6,
        "hour": 12,
        "minute": 41,
        "second": 30,
        "dst": 1
    },
    "uuid": "0000-b8-27-eb-e85eff"
}
{
    "origin": "receiver",
    "protocol": "datetime",
    "message": {
        "longitude": 9.000000,
        "latitude": 44.633000,
        "year": 2020,
        "month": 6,
        "day": 5,
        "weekday": 6,
        "hour": 12,
        "minute": 41,
        "second": 31,
        "dst": 1
    },
    "uuid": "0000-b8-27-eb-e85eff"
}
看 最简单的方法是分别在文件的开头和结尾添加
[
]
,并在任何单个json对象之间添加

一旦加载了“json”对象列表,您就可以执行以下操作来过滤它们:

filtered_jsons = [single_json for single_json in all_jsons if single_json.get('protocol') != "datetime"]
看 最简单的方法是分别在文件的开头和结尾添加
[
]
,并在任何单个json对象之间添加

一旦加载了“json”对象列表,您就可以执行以下操作来过滤它们:

filtered_jsons = [single_json for single_json in all_jsons if single_json.get('protocol') != "datetime"]

文件内容不是正确的json。您需要使用
分隔对象,并将所有内容像
[{…},{…},…][/code>那样放入列表中

下面是示例代码:

#假设我们已将您的文件加载到str变量
文件内容=“”
{
“信息”:{
“id”:31,
“单位”:15,
“状态”:“向下”
},
“来源”:“接收者”,
“协议”:“arctech屏幕旧”,
“uuid”:“0000-b8-27-eb-e85eff”,
“重复”:1
}
{
“来源”:“接收者”,
“协议”:“日期时间”,
“信息”:{
“经度”:9.000000,
“纬度”:44.633000,
“年份”:2020年,
“月”:6,
“天”:5,
“工作日”:6,
“小时”:12,
“分钟”:41,
“第二”:30,
“dst”:1
},
“uuid”:“0000-b8-27-eb-e85eff”
}
{
“来源”:“接收者”,
“协议”:“日期时间”,
“信息”:{
“经度”:9.000000,
“纬度”:44.633000,
“年份”:2020年,
“月”:6,
“天”:5,
“工作日”:6,
“小时”:12,
“分钟”:41,
“第二”:31,
“dst”:1
},
“uuid”:“0000-b8-27-eb-e85eff”
}
'''
更改为正确的json将如下所示:

导入json
进口稀土
正确的json字符串='[\n'+re.sub(r'}\n{,r'},\n{,文件内容)+'\n]'
data=json.load(正确的json字符串)

文件内容不是正确的json。您需要使用
分隔对象,并将所有内容都像
[{…},{…},…][/code>那样放入列表中

下面是示例代码:

#假设我们已将您的文件加载到str变量
文件内容=“”
{
“信息”:{
“id”:31,
“单位”:15,
“状态”:“向下”
},
“来源”:“接收者”,
“协议”:“arctech屏幕旧”,
“uuid”:“0000-b8-27-eb-e85eff”,
“重复”:1
}
{
“来源”:“接收者”,
“协议”:“日期时间”,
“信息”:{
“经度”:9.000000,
“纬度”:44.633000,
“年份”:2020年,
“月”:6,
“天”:5,
“工作日”:6,
“小时”:12,
“分钟”:41,
“第二”:30,
“dst”:1
},
“uuid”:“0000-b8-27-eb-e85eff”
}
{
“来源”:“接收者”,
“协议”:“日期时间”,
“信息”:{
“经度”:9.000000,
“纬度”:44.633000,
“年份”:2020年,
“月”:6,
“天”:5,
“工作日”:6,
“小时”:12,
“分钟”:41,
“第二”:31,
“dst”:1
},
“uuid”:“0000-b8-27-eb-e85eff”
}
'''
更改为正确的json将如下所示:

导入json
进口稀土
正确的json字符串='[\n'+re.sub(r'}\n{,r'},\n{,文件内容)+'\n]'
data=json.load(正确的json字符串)