2015-10-29 2 views
3

Я пытаюсь разобрать действительно большой файл JSON в Python. Файл имеет 6523440 строк, но разбит на множество объектов JSON.Разбор большого файла JSON в Python

структура выглядит следующим образом:

[ 
    { 
    "projects": [ 
    ... 
    ] 
    } 
] 
[ 
    { 
    "projects": [ 
    ... 
    ] 
    } 
] 
.... 
.... 
.... 

и он идет дальше и дальше ...

Каждый раз, когда я пытаюсь загрузить его с помощью json.load() я получаю сообщение об ошибке

ValueError: Extra data: line 2247 column 1 - line 6523440 column 1 (char 101207 - 295464118) 

На линии, где заканчивается первый объект, и начинается второй. Есть ли способ загрузить их отдельно или что-то подобное?

+1

Я думаю, что вы должны разобрать файл самостоятельно и разделить его на отдельные объекты * до * передавая его 'json.load' - он не обрабатывает чтение немного, и передавая ее обратно, как, например, 'pickle', AFAIK. – jonrsharpe

+0

Эта структура предлагает несколько массивов одного объекта – danielcooperxyz

+0

Это так. 2900 из них, если быть точным – Luka

ответ

2

Вы можете попробовать использовать потоковый JSon библиотеки как ijson:

Иногда, когда дело с особенно большим JSON полезной нагрузкой он может стоит даже не строить отдельные объекты Python и реагировать на отдельных событий сразу же производить некоторые

0

Пробуйте использовать json.JSONDecoder.raw_decode. Он по-прежнему требует наличия всего документа в памяти, но позволяет вам итеративно декодировать многие объекты из одной строки.

import re 
import json 

document = """ 
[ 
    1, 
    2, 
    3 
] 
{ 
    "a": 1, 
    "b": 2, 
    "c": 3 
} 
""" 

not_whitespace = re.compile(r"\S") 

decoder = json.JSONDecoder() 

items = [] 
index = 0 
while True: 
    match = not_whitespace.search(document, index) 
    if not match: 
     break 

    item, index = decoder.raw_decode(document, match.start()) 
    items.append(item) 

print(items)