Ошибка при чтении большого файла JSON с Python: "json.decoder.JSONDecodeError: Expecting ',' delimiter" - PullRequest
0 голосов
/ 18 декабря 2018

Я пытаюсь прочитать большой файл JSON (около 3 Go) с Python.Файл на самом деле содержит около 7 миллионов объектов json (по одному на строку).

Я пробовал довольно много разных решений, но продолжаю сталкиваться с одной и той же ошибкой:

json.decoder.JSONDecodeError: Expecting ',' delimiter: line 1 column 25 (char 24)

Код, который я использую, находится здесь:

import json
import pandas as pd

with open('mydata.json') as json_file:
data = json_file.readlines()
# this line below may take at least 8-10 minutes of processing for 4-5 
# million rows. It converts all strings in list to actual json objects.
data = list(map(json.loads, data))

pd.DataFrame(data)

Любойидеи о том, почему я получаю эту ошибку?Кажется, это связано с форматом файла, но в принципе он в правильном формате json (я проверил несколько строк с https://jsonformatter.curiousconcept.com/).

Я также попытался прочитать намного более короткую версию файла (только около 30 строк), и эта операция прошла успешно.

Ответы [ 2 ]

0 голосов
/ 18 декабря 2018

слегка очищенная версия кода Бобарфа на Python 3:

import json
import logging
import pandas as pd

logger = logging.getLogger(__name__)

def iter_good_json_lines(lines):
    for lineno, line in enumerate(lines, 1):
        try:
            yield json.loads(line.strip())
        except json.JSONDecodeError as err:
            logger.warning(f"lineno {lineno}:{err.colno} {err.msg}: {err.doc}")

with open('mydata.json') as fd:
    data = pd.DataFrame(iter_good_json_lines(fd))

data

это меняет:

  • итерация открытого файла дает вам итератор, который выдает строки
  • используйте модуль logging, чтобы ошибки не заканчивались на stdout
  • Pandas> = 0,13 позволяет передавать генератор в конструктор DataFrame
  • f-строк!
0 голосов
/ 18 декабря 2018

Разработка комментария выше: одна или несколько строк в файле данных, скорее всего, не являются JSON, поэтому Python выдает ошибку при попытке загрузить строку в объект JSON.

В зависимости ото том, что вам нужно, вы можете либо позволить своему коду сбоить, потому что вы полагаетесь на то, что все строки этого файла являются JSON, а если нет, вы хотите знать (как это происходит сейчас), или вы можете избежать синтаксического анализа-JSON-строки вообще и ваш код выдает предупреждение при каждом их достижении.

Чтобы реализовать второе решение, оберните строку в загрузку JSON в блок try, чтобы отсеять все ошибочные строки.Если вы сделаете это, все строки, не являющиеся JSONS, будут проигнорированы, и ваш код продолжит попытки проанализировать все остальные строки.

Вот как я бы это реализовал:

import json
from json import JSONDecodeError
import pandas as pd
data = []
with open('mydata.json') as json_file:
    for line in json_file.readlines():
        js = None
        try:
            js = json.loads(line)
        except JSONDecodeError:
            print('Skipping line %s' %(line))
        if js:
            #You don't want None value in your dataframe
            data.append(js)
test = pd.DataFrame(data)
with pd.option_context('display.max_rows', None, 'display.max_columns', None):
    print(test)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...