我有一个包含多个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),但仅仅能够读取所有条目就足够了。
你可以尝试使用pandas:
import pandas as pd
filename='run_log.json'
df = pd.read_json(filename, lines=True)
NDJSON,不是 JSON。
这是一种有效的文件格式,经常与 JSON 混淆。
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}]}
每一行都是有效的 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}]}