在Python中加载和解析包含多个JSON对象的JSON文件

Pi_*_*Pi_ 97 python json file jsonlines

我试图在Python中加载和解析JSON文件.但是我一直试图加载文件:

import json
json_data = open('file')
data = json.load(json_data)
Run Code Online (Sandbox Code Playgroud)

产量:

ValueError: Extra data: line 2 column 1 - line 225116 column 1 (char 232 - 160128774)
Run Code Online (Sandbox Code Playgroud)

我看了18.2.json- Python文档中的JSON编码器和解码器,但阅读这些看起来很糟糕的文档非常令人沮丧.

Mar*_*ers 201

您有一个JSON Lines格式的文本文件.您需要逐行解析文件:

import json

data = []
with open('file') as f:
    for line in f:
        data.append(json.loads(line))
Run Code Online (Sandbox Code Playgroud)

包含有效的JSON,但作为一个整体,它不是有效的JSON值,因为没有顶级列表或对象定义.

请注意,因为该文件每行包含JSON,所以您可以一次性尝试解析它或者找出流式JSON解析器.您现在可以选择单独处理每一行,然后再继续下一步,在此过程中节省内存.您可能不希望将每个结果附加到一个列表中,然后在文件非常大的情况下处理所有内容.

如果您有一个包含单个JSON对象的文件,其间有分隔符,请使用如何使用'json'模块一次读入一个JSON对象?使用缓冲方法解析单个对象.

  • +1也许值得注意的是,如果您不需要同时处理所有对象,那么逐个处理它们可能是更有效的方法.这样您就不需要将整个数据存储在内存中,而只需要将其存储在内存中. (2认同)
  • @Pi_:你将有一个字典,所以只需访问字段作为键:`data = json.loads(line); 打印数据[u'votes']` (2认同)

小智 28

如果您正在使用pandas并且有兴趣将json文件作为数据帧加载,您可以使用:

import pandas as pd
df = pd.read_json('file.json', lines=True)
Run Code Online (Sandbox Code Playgroud)

要将其转换为 json 数组,您可以使用:

df.to_json('new_file.json')
Run Code Online (Sandbox Code Playgroud)

  • 在我看来,这个答案是最Pythonic的。 (2认同)

wou*_*lee 6

对于那些绊脚石的人:jsonlines优雅的python 库(比这个问题还年轻)。处理每行一个json文档的文件。参见https://jsonlines.readthedocs.io/