【问题标题】:Large ndjson file can not be loaded correctly in Python大型 ndjson 文件无法在 Python 中正确加载
【发布时间】:2020-08-18 10:18:21
【问题描述】:

我有一个大小为 5 GB 的 json 文件。我想加载它并对其进行一些 EDA,以便找出相关信息在哪里。

我试过了:

import json
import pprint

json_fn = 'abc.ndjson'
data = json.load(open(json_fn, 'rb'))
pprint.pprint(data, depth=2)

但这只是崩溃

Process finished with exit code 137 (interrupted by signal 9: SIGKILL)

我也试过了:

import ijson

with open(json_fn) as f:
    items = ijson.items(f, 'item', multiple_values=True)  # "multiple values" needed as it crashes otherwise with a "trailing garbage parse error" (https://stackoverflow.com/questions/59346164/ijson-fails-with-trailing-garbage-parse-error)
    print('Data loaded - no processing ...')
    print("---items---")
    print(items)
    for item in items:
        print("---item---")
        print(item)

但这只是返回:

Data loaded, now importing
---items---
<_yajl2.items object at 0x7f436de97440>

Process finished with exit code 0

ndjson 文件包含有效的 ascii 字符(使用 vi 检查)但行很长,因此无法从文本编辑器中真正理解。

文件开头如下:

{"visitId":257057,"staticFeatures":[{"type":"CODES","value":"9910,51881,42833,486,4280,42731,2384,V5861,9847,3962,49320,3558,2720,4019,99092"},{"type":"visitID","value":"357057"},{"type":"VISITOR_ID","value":"68824"}, {"type":"ADMISSION_ID","value":"788457"},{"type":"AGE","value":"34"}, ...

我做错了什么,我该如何处理这个文件?

【问题讨论】:

    标签: python json


    【解决方案1】:

    您正在使用前缀item。为此,json 应该将 list 作为顶级元素。

    例如看下面的json

    data2.json

    [
        {
          "Identifier": "21979c09fc4e6574"
        },
        {
          "Identifier": "e6235cce58ec8b9c"
        }
     ]
    

    代码:

    with open('data2.json') as fp:
        items = ijson.items(fp, 'item')
        for x in items:
            print(x)
    

    输出:

    {'Identifier': '21979c09fc4e6574'}
    {'Identifier': 'e6235cce58ec8b9c'}
    

    另一个例子

    data.json

    {
      "earth": {
        "europe": [
          {"name": "Paris", "type": "city", "info": {  }},
          {"name": "Thames", "type": "river", "info": {  }}
        ],
        "america": [
          {"name": "Texas", "type": "state", "info": {  }}
        ]
      }
    }
    

    json 上方没有列表作为顶级元素,因此我应该为ijson.items() 提供有效前缀。前缀应该是'earth.europe.item'

    代码:

    with open('data.json') as fp:
        items = ijson.items(fp, 'earth.europe.item')
        for x in items:
            print(x)
    

    输出:

    {'name': 'Paris', 'type': 'city', 'info': {}}
    {'name': 'Thames', 'type': 'river', 'info': {}}
    

    【讨论】:

    • 是的,但我不知道像您的示例“earth.europe.item”中那样的 json 结构 - 我已经添加了上面文件的前几行
    • 如果你想访问staticFeatures值前缀应该是staticFeatures.item
    猜你喜欢
    • 2020-12-17
    • 2017-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-24
    • 2017-11-17
    相关资源
    最近更新 更多