Python 解析并grep包含JSON格式条目的日志文件
我想解析pilight的日志。它有多个JSON条目,大部分是datetime条目,而不是单个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
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字符串)