У меня есть следующие данные в моей JSON файл:Читать словарь JSON верхнего уровня пошагово с помощью Python ijson
{
"first": {
"name": "James",
"age": 30
},
"second": {
"name": "Max",
"age": 30
},
"third": {
"name": "Norah",
"age": 30
},
"fourth": {
"name": "Sam",
"age": 30
}
}
Я хочу напечатать ключ верхнего уровня и объект следующим образом:
import json
import ijson
fname = "data.json"
with open(fname) as f:
raw_data = f.read()
data = json.loads(raw_data)
for k in data.keys():
print k, data[k]
ВЫХОД:
second {u'age': 30, u'name': u'Max'}
fourth {u'age': 30, u'name': u'Sam'}
third {u'age': 30, u'name': u'Norah'}
first {u'age': 30, u'name': u'James'}
Итак, далеко не так хорошо. Однако, если я хочу сделать то же самое для огромного файла, мне придется прочитать все это в памяти. Это очень медленно и требует большой памяти.
Я хочу использовать добавочную JSON парсер (ijson
в данном случае), чтобы достичь того, что я описал ранее:
Приведенный выше код был взят из: No access to top level elements with ijson?
with open(fname) as f:
json_obj = ijson.items(f,'').next() # '' loads everything as only one object.
for (key, value) in json_obj.items():
print key + " -> " + str(value)
Это не подходит либо, потому что он также считывает весь файл в памяти. Это не поистине постепенное.
Как я могу выполнить инкрементный синтаксический анализ ключей верхнего уровня и соответствующих объектов из файла JSON в Python?
Входящий файл не может быть отформатирован таким образом. Также идея заключалась в том, чтобы не загружать весь файл в память сразу. – tuxdna
Просьба показать другие форматы. Вы можете добавить условия 'if' для всех возможностей комбинации квадратов/фигурных скобок. Также см. Принятый ответ в ссылке. Итерируемый подход * использует буферизованное управление вводами и памятью, поэтому вам не нужно беспокоиться о больших файлах. * Плюс, цикл прекращается после разбора верхнего уровня, поэтому он не читается в последнюю строку. – Parfait