繁体   English   中英

如何读取多个 JSON 片段仅由换行符分隔的多行 json 类文件?

[英]How to read multiline json-like file with multiple JSON fragments separated by just a new line?

我有一个 json 文件,其中包含多个 json 对象(每个 object 可以是多行 json)示例:

{"date": "2022-11-29", "runs": [{"23597": 821260}, {"23617": 821699}]}
{"date": "2022-11-30", "runs": [{"23597": 821269}, {"23617": 8213534}]}

请注意,这确实不是有效的 JSON 作为整个文件(因此常规的“在 Python 中读取 JSON”代码失败,预计),但每个单独的“片段”都是完整且有效的 JSON。听起来文件是由某些日志记录工具生成的只需将下一个块作为文本附加到文件中。

正如预期的那样,我尝试使用以下代码片段进行的常规阅读方式失败了:

with open('run_log.json','r') as file:
    d = json.load(file)
    print(d)

产生关于无效 JSON 的预期错误:

JSONDecodeError:额外数据:第 3 行第 1 列(字符 89)

我该如何解决这个问题,可能使用 json 模块? 理想情况下,我想读取 json 文件并获取特定日期(例如:2022-11-30)的运行列表,但仅能够读取所有条目就足够了。

NDJSON ,而不是 JSON。

这是一种有效的文件格式,经常与 JSON 混淆。

Python 当然有一个图书馆。

import ndjson

with open('run_log.json','r') as file:
    d = ndjson.load(file)
    for elem in d:
        print(type(elem), elem)

output

<class 'dict'> {'date': '2022-11-29', 'runs': [{'23597': 821260}, {'23617': 821699}]}
<class 'dict'> {'date': '2022-11-30', 'runs': [{'23597': 821269}, {'23617': 8213534}]}

每行都是有效的 JSON(请参阅JSON 行格式),它是一种很好的记录器格式,因为文件可以 append 新的 JSON 行,而无需像 JSON 那样读取/修改/写入整个文件。

您可以使用json.loads()一次解析一行。

鉴于 run_log.json:

{"date": "2022-11-29", "runs": [{"23597": 821260}, {"23617": 821699}]}
{"date": "2022-11-30", "runs": [{"23597": 821269}, {"23617": 8213534}]}

采用:

import json

with open('run_log.json', encoding='utf8') as file:
    for line in file:
        data = json.loads(line)
        print(data)

Output:

{'date': '2022-11-29', 'runs': [{'23597': 821260}, {'23617': 821699}]}
{'date': '2022-11-30', 'runs': [{'23597': 821269}, {'23617': 8213534}]}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM