如何读取多个 JSON 片段(仅用新行分隔)的多行 json 类文件?

问题描述 投票:0回答:3

我有一个包含多个json对象的json文件(每个对象可以是多行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),但仅仅能够读取所有条目就足够了。

python json
3个回答
0
投票

你可以尝试使用pandas:

import pandas as pd
filename='run_log.json'
df = pd.read_json(filename, lines=True)

-1
投票

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)

输出

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

-1
投票

每一行都是有效的 JSON(请参阅JSON 行格式),并且它作为记录器是一种很好的格式,因为文件可以附加新的 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)

输出:

{'date': '2022-11-29', 'runs': [{'23597': 821260}, {'23617': 821699}]}
{'date': '2022-11-30', 'runs': [{'23597': 821269}, {'23617': 8213534}]}
© www.soinside.com 2019 - 2024. All rights reserved.