Как использовать модуль «json» для чтения в одном объекте JSON за раз?

У меня есть многогигабайтный JSON-файл. Файл состоит из объектов JSON длиной не более нескольких тысяч символов, но между записями нет разрывов строк.

Используя Python 3 и модуль json , как я могу прочитать один объект JSON за раз из файла в память?

Данные находятся в текстовом файле. Вот пример аналогичной записи. Фактические записи содержат много вложенных словарей и списков.

Запись в читаемом формате:

 { "results": { "__metadata": { "type": "DataServiceProviderDemo.Address" }, "Street": "NE 228th", "City": "Sammamish", "State": "WA", "ZipCode": "98074", "Country": "USA" } } } 

Фактический формат. Новые записи начинаются один за другим без перерывов.

 {"results": { "__metadata": {"type": "DataServiceProviderDemo.Address"},"Street": "NE 228th","City": "Sammamish","State": "WA","ZipCode": "98074","Country": "USA" } } }{"results": { "__metadata": {"type": "DataServiceProviderDemo.Address"},"Street": "NE 228th","City": "Sammamish","State": "WA","ZipCode": "98074","Country": "USA" } } }{"results": { "__metadata": {"type": "DataServiceProviderDemo.Address"},"Street": "NE 228th","City": "Sammamish","State": "WA","ZipCode": "98074","Country": "USA" } } } 

  • Разница в цепочке ES6 Promises и PEP3148 Фьючерсы
  • Измерение прошедшего времени в python
  • Django Formsets - form.is_valid () - ложное предупреждение о получении формы
  • Python ImportError не может импортировать urandom. Обновление Ubuntu 12.04
  • Как выбрать профиль AWS при использовании boto3 для подключения к CloudFront
  • Python mock builtin 'open' в классе, используя два разных файла
  • Pandas groupby и qcut
  • Проблема с отправкой запросов POST с использованием запросов библиотеки
  • 3 Solutions collect form web for “Как использовать модуль «json» для чтения в одном объекте JSON за раз?”

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

    Ниже приводятся полные объекты, когда парсер находит их:

     from json import JSONDecoder from functools import partial def json_parse(fileobj, decoder=JSONDecoder(), buffersize=2048): buffer = '' for chunk in iter(partial(fileobj.read, buffersize), ''): buffer += chunk while buffer: try: result, index = decoder.raw_decode(buffer) yield result buffer = buffer[index:] except ValueError: # Not enough data to decode, read more break 

    Эта функция будет считывать фрагменты из заданного объекта файла в buffersize , а объект- decoder анализирует все объекты JSON из буфера. Каждому анализируемому объекту присваивается вызывающий объект.

    Используйте его так:

     with open('yourfilename', 'r') as infh: for data in json_parse(infh): # process object 

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

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

    Обратите внимание, что вы должны использовать его в библиотеке YAJL , иначе вы, скорее всего, не увидите увеличения производительности.

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

    Вот небольшая модификация решения Martijn Pieters , которая будет обрабатывать строки JSON, разделенные пробелами.

     def json_parse(fileobj, decoder=json.JSONDecoder(), buffersize=2048, delimiters=None): remainder = '' for chunk in iter(functools.partial(fileobj.read, buffersize), ''): remainder += chunk while remainder: try: stripped = remainder.strip(delimiters) result, index = decoder.raw_decode(stripped) yield result remainder = stripped[index:] except ValueError: # Not enough data to decode, read more break 

    Например, если data.txt содержит строки JSON, разделенные пробелом:

     {"business_id": "1", "Accepts Credit Cards": true, "Price Range": 1, "type": "food"} {"business_id": "2", "Accepts Credit Cards": true, "Price Range": 2, "type": "cloth"} {"business_id": "3", "Accepts Credit Cards": false, "Price Range": 3, "type": "sports"} 

    тогда

     In [47]: list(json_parse(open('data'))) Out[47]: [{u'Accepts Credit Cards': True, u'Price Range': 1, u'business_id': u'1', u'type': u'food'}, {u'Accepts Credit Cards': True, u'Price Range': 2, u'business_id': u'2', u'type': u'cloth'}, {u'Accepts Credit Cards': False, u'Price Range': 3, u'business_id': u'3', u'type': u'sports'}] 
    Interesting Posts

    Есть ли готовый jQuery-заменитель, который я могу использовать для urllib.quote и urllib.unquote в Python 2.6.5?

    Scipy поворачивает и масштабирует изображение без изменения его размеров

    селен не выполняет итерацию по элементам

    Robot framework передает cookie для получения запроса (RequestsLibrary) – TypeError

    Барная диаграмма с несколькими ярлыками

    Использование os.walk () для рекурсивного прохождения каталогов в Python

    Получить список значений атрибутов XML в Python

    Регулярное выражение для замены некоторых точек запятыми в комментариях клиентов

    Граница решения границы matplotlib

    Многократное сопоставление Python (создание классов эквивалентности)

    Python с использованием метода производного класса в родительском классе?

    Python: отправка функции печати в качестве параметра

    Многомерный / вложенный DataFrame / набор данных / панель в пандах

    Python 3.4: ImportError: ни один модуль с именем win32api

    Может ли этот интерпретатор нотации Postfix нотации (обратный лак) Python быть более эффективным и точным?

    Python - лучший язык программирования в мире.