Подсчитайте уникальные значения в объектах в большом файле JSON с помощью Python

У меня есть довольно большие файлы JSON. Каждый содержит тысячи объектов в одном (1) массиве. JSON структурированы в следующем формате:

{
    "alert": [
    { "field1": "abc",
    "field2": "def",
    "field3": "xyz
},
{ "field1": null,
"field2": null,
"field3": "xyz",
},
...
...
]

Каков наиболее эффективный способ использования Python и библиотеки json для поиска в файле JSON, поиска уникальных значений в каждом объекте в массиве и подсчета количества их появления? Например, найдите в объектах массива "field3" значение "xyz" и подсчитайте, сколько раз оно появляется. Я попробовал несколько вариантов, основанных на существующих решениях в StackOverflow, но они не дают нужных мне результатов.


person user3680081    schedule 09.09.2017    source источник


Ответы (1)


Быстрый поиск на PyPI подвернулся

  • ijson 2.3 — итеративный синтаксический анализатор JSON со стандартным интерфейсом итератора Python
    https://pypi.python.org/pypi/ijson

Вот пример, который должен работать для ваших данных

import ijson

counts = {}
with file("data.json") as f:
    objects = ijson.items(f, 'alert.item')
    for o in objects:
        for k, v in o.items():
            field = counts.get(k,{})
            total = field.get(v,0)
            field[v] = total + 1
            counts[k] = field

import json
print json.dumps(counts, indent=2)

выполнение этого с вашими демонстрационными данными в data.json дает

{
  "field2": {
    "null": 1, 
    "def": 1
  }, 
  "field3": {
    "xyz": 2
  }, 
  "field1": {
    "null": 1, 
    "abc": 1
  }
}

Однако обратите внимание, что null в вашем вводе было преобразовано в строку «null».

Для сравнения, вот команда jq, которая дает эквивалентный результат, используя tostream

 jq -M '
    reduce (tostream|select(length==2)) as [$p,$v] (
      {}
    ; ($p[2:]+[$v|tostring]) as $k
    | setpath($k; getpath($k)+1)
    )
' data.json
person jq170727    schedule 09.09.2017