使用Python解析文本文件中的多个json对象

使用Python解析文本文件中的多个json对象,python,json,ijson,Python,Json,Ijson,我有一个.json文件,其中每一行都是一个对象。例如,前两行是: {"review_id":"x7mDIiDB3jEiPGPHOmDzyw","user_id":"msQe1u7Z_XuqjGoqhB0J5g","business_id": ...} {"review_id":"dDl8zu1vWPdKGihJrwQbpw","user_id":"msQe1u7Z_XuqjGoqhB0J5g","business_id": ...} 我已尝试使用ijson lib进行如下处理: with o

我有一个.json文件,其中每一行都是一个对象。例如,前两行是:

{"review_id":"x7mDIiDB3jEiPGPHOmDzyw","user_id":"msQe1u7Z_XuqjGoqhB0J5g","business_id": ...}

{"review_id":"dDl8zu1vWPdKGihJrwQbpw","user_id":"msQe1u7Z_XuqjGoqhB0J5g","business_id": ...}
我已尝试使用ijson lib进行如下处理:

with open(filename, 'r') as f:
    objects = ijson.items(f, 'columns.items')
    columns = list(objects) 
但是,我得到一个错误:

JSONError: Additional data
它似乎是由于多个对象,我收到这样的错误

在Jupyter中分析此类Json文件的推荐方法是什么


提前感谢

您的文件中有多行,因此它会抛出错误

import json

with open(filename, 'r') as f:
    lines = f.readlines()
    first = json.loads(lines[0])
    second = json.loads(lines[1])

这应该捕获这两行并正确地加载它们

,而每一行本身都是有效的JSON,而您的文件作为一个整体是无效的。因此,您不能一次性解析它,您必须遍历每一行并将其解析为一个对象

您可以将这些对象聚合到一个列表中,然后从中对数据执行任何操作:

import json
with open(filename, 'r') as f:
    object_list = []
    for line in f.readlines():
        object_list.append(json.loads(line))
    # object_list will contain all of your file's data
您可以将其作为一个列表来理解,使其更具python风格:

with open(filename, 'r') as f:    
    object_list = [json.loads(line) 
                   for line in f.readlines()]
    # object_list will contain all of your file's data

如果这是完整的文件,则文件格式不正确。在花括号之间必须有一个逗号,并且应该以方括号开始和结束。像这样:
[{…},{…}]
。对于您的数据,它看起来像:

[{"review_id":"x7mDIiDB3jEiPGPHOmDzyw","user_id":"msQe1u7Z_XuqjGoqhB0J5g","business_id": ...},
{"review_id":"dDl8zu1vWPdKGihJrwQbpw","user_id":"msQe1u7Z_XuqjGoqhB0J5g","business_id": ...}]
以下是一些如何清理文件的代码:

lastline = None

with open("yourfile.json","r") as f:
    lineList = f.readlines()
    lastline=lineList[-1]

with open("yourfile.json","r") as f, open("cleanfile.json","w") as g:
    for i,line in enumerate(f,0):
        if i == 0:
            line = "["+str(line)+","
            g.write(line)
        elif line == lastline:            
            g.write(line)
            g.write("]")
        else:
            line = str(line)+","
            g.write(line)

若要正确读取JSON文件,还可以考虑使用BANDA库().< /P> 如果您不熟悉pandas,这里是一个快速入门,介绍如何使用dataframe对象:

df.head() #gives you the first rows of the dataframe
df["review_id"] # gives you the column review_id as a vector
df.iloc[1,:] # gives you the complete row with index 1
df.iloc[1,2] # gives you the item in row with index 1 and column with index 2 

您的整个文件实际上是有效的json吗?或者只有每一行都是有效的json?如果没有更具体的json,我无法给出答案,但您可以尝试通过使用
分隔json对象并将其包装在
[]中,将其转换为一个列表
似乎每一行都是有效的json,而且有数百万行。问题是我有一个相当大的json文件,如果我试图读取json,就会导致内存错误。因此,我正试图遵循来自的指示。同样,文件格式不正确。我应该想办法把它们用逗号分隔的方括号括起来。我刚刚添加了一些代码,您可以使用这些代码以正确的格式创建一个新的json文件。然而,如果你的文件对熊猫来说太大了,我担心这需要一段时间。而且速度比我预期的要快。这是你接受的答案,还是你仍然有一些问题?我不确定公平地说这是一个无效的JSON文件。例如,在我的用例中,我有一个网络套接字,而不是一个文件。现在,你会说我有一个无效的JSON套接字吗?:)JSON只允许在文档的根目录下有一个对象。你有两个。这在客观上是无效的。话虽如此,用换行符分隔JSON是一件非常常见的事情。您只需要将每一行作为不同的JSON对象来读取,仅此而已。将整个对象作为单个对象处理将失败,因为您有多个对象。您链接的答案是一个更复杂的解决方案,当对象之间没有分隔符时,该解决方案是有保证的。如果你有在你的对象之间添加新线的奢侈,你应该利用它。
df.head() #gives you the first rows of the dataframe
df["review_id"] # gives you the column review_id as a vector
df.iloc[1,:] # gives you the complete row with index 1
df.iloc[1,2] # gives you the item in row with index 1 and column with index 2