在python中读取带有json对象流的文件

时间:2019-07-17 17:10:05

标签: python json python-3.x

这可能是多余的,但是在阅读了以前的文章和答案之后,我仍然没有得到我的代码。我有一个非常大的文件,其中包含多个不受任何值限制的json对象:

  
    

{“ _ index”:“ 1234”,“ _type”:“ 11”,“ _id”:“ 1234”,“ _score”:0.0,“ fields”:{“ c_u”:[“ url.com”] ,“ tawgs.id”:[“ p6427”]}} {“ _ index”:“ 1234”,“ _type”:“ 11”,“ _id”:“ 786fd4ad2415aa7b”,“ _score”:0.0,“ fields”:{ “ c_u”:[“ url2.com”],“ tawgs.id”:[“ p12519”]}} {“ _ index”:“ 1234”,“ _type”:“ 11”,“ _id”:“ 5826e7cbd92d951a”, “ _score”:0.0,“ fields”:{“ tawgs.id”:[“ p8453”,“ p8458”]}}

  

我已经读到了这正是JSON-RPC的样子,但是仍然无法实现打开/解析文件以在python中创建数据框的功能。

我尝试了以下格式:

i = 0
d = json.JSONDecoder()
while True:
    try:
        obj, i = d.raw_decode(s, i)
    except ValueError:
        return
    yield obj

但是没有用。

我也尝试了一个基本的方法:

with open('output.json','r') as f:
    data = json.load(f)

但抛出错误:

  
    

JSONDecodeError:额外数据:第1行第184列(字符183)

  

尝试带附加的json.decode()也不起作用,并且返回的数据为空[]

data = []
with open('es-output.json', 'r') as f:
    for line in f:
        try:
            data.append(json.loads(line))
        except json.decoder.JSONDecodeError:
            pass # skip this line 

请帮助!预先感谢

2 个答案:

答案 0 :(得分:0)

问题出在数据本身! 在此数据中,您使用3个值,但没有键。

第一个是:

{"_index".... ["p6427"]}}

第二个是:

{"_index".... ["p12519"]}}

第三个是:

{"_index".... ["p8458"]}}

您希望对每个值都影响一个键,例如:

{
"k1":{"_index": "1234", "_type": "11", "_id": "1234", "_score": 0.0, "fields": {"c_u": ["url.com"], "tawgs.id": ["p6427"]}},

"k2":{"_index": "1234", "_type": "11", "_id": "786fd4ad2415aa7b", "_score": 0.0, "fields": {"c_u": ["url2.com"], "tawgs.id": ["p12519"]}},

"k3":{"_index": "11_20190714_184325_01", "_type": "11", "_id": "5826e7cbd92d951a", "_score": 0.0, "fields": {"tawgs.id": ["p8453", "p8458"]}}
}

通过这种方式,一切都会正常运行,并且数据将被很好地加载。

答案 1 :(得分:0)

这将尝试迭代解码s内部的JSON流:

s = '''{"_index": "1234", "_type": "11", "_id": "1234", "_score": 0.0, "fields": {"c_u": ["url.com"], "tawgs.id": ["p6427"]}}{"_index": "1234", "_type": "11", "_id": "786fd4ad2415aa7b", "_score": 0.0, "fields": {"c_u": ["url2.com"], "tawgs.id": ["p12519"]}}{"_index": "1234", "_type": "11", "_id": "5826e7cbd92d951a", "_score": 0.0, "fields": {"tawgs.id": ["p8453", "p8458"]}}'''

import json

d = json.JSONDecoder()

idx = 0
while True:
    if idx >= len(s):
        break
    data, i = d.raw_decode(s[idx:])
    idx += i
    print(data)
    print('*' * 80)

打印:

{'_index': '1234', '_type': '11', '_id': '1234', '_score': 0.0, 'fields': {'c_u': ['url.com'], 'tawgs.id': ['p6427']}}
********************************************************************************
{'_index': '1234', '_type': '11', '_id': '786fd4ad2415aa7b', '_score': 0.0, 'fields': {'c_u': ['url2.com'], 'tawgs.id': ['p12519']}}
********************************************************************************
{'_index': '1234', '_type': '11', '_id': '5826e7cbd92d951a', '_score': 0.0, 'fields': {'tawgs.id': ['p8453', 'p8458']}}
********************************************************************************