Python парсинг json из файла

Интерпретация JSON в Python – как читать файлы JSON

img

JSON (JavaScript Object Notation – нотация объектов JavaScript) – это популярный способ структурирования данных. Он используется для обмена информацией между веб-приложением и сервером. Но как прочитать файл JSON в Python?

В этой статье я покажу вам, как использовать методы json.loads() и json.load() для интерпретации (или как еще говорят парсинга) и чтения файлов и строк JSON.

Синтаксис JSON

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

Вот пример данных JSON с данными организации:

Как парсить строки JSON в Python

Python имеет встроенный модуль, который позволяет работать с данными в формате JSON. Вам необходимо будет импортировать модуль json .

Если вам необходимо проинтерпретировать строку JSON, возвращающую словарь, то вы можете воспользоваться методом json.loads() .

import json # assigns a JSON string to a variable called jess jess = '' # parses the data and assigns it to a variable called jess_dict jess_dict = json.loads(jess) # Printed output: print(jess_dict)

Как парсить и читать файлы JSON в Python

В данном примере мы имеем файл в формате JSON с именем fcc.json , который содержит те же данные, что и ранее, касающиеся курсов, которые предлагает сайт.

Если вы хотите прочитать этот файл, то для начала вам нужно использовать встроенную в Python функцию open() с режимом чтения. Мы используем ключевое слово with , чтобы убедиться, что файл закрыт.

with open('fcc.json', 'r') as fcc_file:

Если файл не может быть открыт, то мы получим ошибку OSError . Это пример ошибки «FileNotFoundError» при опечатке в имени файла fcc.json .

FileNotFoundError

Затем мы можем проинтерпретировать файл, используя метод json.load() и присвоить его переменной с именем fcc_data .

fcc_data = json.load(fcc_file)

И в конце мы должны напечатать результат.

Вот так будет выглядеть полный код:

import json with open('fcc.json', 'r') as fcc_file: fcc_data = json.load(fcc_file) print(fcc_data)

Как красиво напечатать данные JSON в Python

Если мы посмотрим на то, как печатаются данные, то увидим, что все данные JSON печатаются в одной строке.

Данные JSON

Однако такой формат вывода может быть затруднительным для чтения. И чтобы это исправить, мы можем реализовать метод json.dumps() с параметром indent (отступ).

В данном примере мы сделаем отступ в 4 пробела и будем печатать данные в более удобном для чтения формате.

print(json.dumps(fcc_data, indent=4))

indent

Также мы можем отсортировать ключи в алфавитном порядке, используя параметр sort_keys и установив его значение на True .

print(json.dumps(fcc_data, indent=4, sort_keys=True))

sort_keys

Заключение

JSON – это популярный способ структурирования данных, который используется для обмена информацией между веб-приложением и сервером.

Читайте также:  Persistent session in java

Если вам необходимо проинтерпретировать строку JSON, которая возвращает словарь, то вы можете использовать метод json.loads() .

Если вам необходимо проинтерпретировать файл JSON, который возвращает словарь, то вы можете использовать метод json.load() .

Источник

msgspec: быстрый и экономичный парсинг JSON на Python

В библиотеке msgspec много функций, например кодирование, поддержка MessagePack (альтернативный формат, который быстрее JSON) и другие. Если вы регулярно парсите файлы JSON, и у вас проблемы с производительностью или памятью, или просто нужны встроенные схемы, то попробуйте msgspec.

Ниже рассказываем о библиотеке подробнее. Итак, чтобы обработать большой файл JSON на Python без сбоев и аварийного завершения, нужно:

  1. Убедиться, что используется не слишком много памяти.
  2. Спарсить файл как можно быстрее.
  3. В идеале также заранее убедиться, что данные валидны и имеют правильную структуру.

Конечно, можно объединить решения с несколькими библиотеками. А можно — всего с одной. Схемы, быстрый парсинг и хитрые приемы для уменьшения потребления памяти — все это новая библиотека msgspec.

json и orjson

Начнем с двух других библиотек: встроенного модуля json на Python и быстрой библиотеки orjson. Вернемся к примеру из моей статьи о потоковом парсинге JSON и спарсим файл размером ~25 Мб, в котором кодируется список объектов JSON (например, словарей). Это события GitHub и пользователи, выполняющие определенные действия с репозиториями:

[,"repo":,"payload":,"public":true,"created_at":"2015-01-01T15:00:00Z">, . ]

Наша цель — выяснить, с какими репозиториями взаимодействовал пользователь.

Вот как это делается со встроенным модулем json стандартной библиотеки Python:

import json with open("large.json", "r") as f: data = json.load(f) user_to_repos = <> for record in data: user = record["actor"]["login"] repo = record["repo"]["name"] if user not in user_to_repos: user_to_repos[user] = set() user_to_repos[user].add(repo) print(len(user_to_repos), "records")

А вот так с orjson (отличается двумя строками):

import orjson with open("large.json", "rb") as f: data = orjson.loads(f.read()) user_to_repos = <> for record in data: # . same as stdlib code . 

Вот сколько памяти и времени занимают эти два варианта:

$ /usr/bin/time -f "RAM: %M KB, Elapsed: %E" python stdlib.py 5250 records RAM: 136464 KB, Elapsed: 0:00.42 $ /usr/bin/time -f "RAM: %M KB, Elapsed: %E" python with_orjson.py 5250 records RAM: 113676 KB, Elapsed: 0:00.28

Потребление памяти одинаковое, но orjson быстрее — 280 мс против 420 мс.

Теперь рассмотрим msgspec.

msgspec: декодирование и кодирование на основе схемы для JSON

Вот соответствующий код с msgspec, здесь подход к парсингу несколько отличается:

from msgspec.json import decode from msgspec import Struct class Repo(Struct): name: str class Actor(Struct): login: str class Interaction(Struct): actor: Actor repo: Repo with open("large.json", "rb") as f: data = decode(f.read(), type=list[Interaction]) user_to_repos = <> for record in data: user = record.actor.login repo = record.repo.name if user not in user_to_repos: user_to_repos[user] = set() user_to_repos[user].add(repo) print(len(user_to_repos), "records")

Этот код длиннее и подробнее, потому что msgspec позволяет определять схемы для записей, парсинг которых вы выполняете.

Очень полезно: схемы для всех полей не нужны. И, хотя в записях JSON много полей (смотрите в примере выше), мы указываем в msgspec только нужные нам.

Вот результат парсинга с msgspec:

$ /usr/bin/time -f "RAM: %M KB, Elapsed: %E" python with_msgspec.py 5250 records RAM: 38612 KB, Elapsed: 0:00.09

Намного быстрее и гораздо меньше памяти.

Читайте также:  Javascript variable in closure

В итоге у нас три решения и еще одно потоковое — ijson:

Пакет Время ОЗУ Постоянная память Схема
Stdlib json 420 мс 136 Мб
orjson 280 мс 114 Мб
ijson 300 мс 14 Мб
msgspec 90 мс 39 Мб

При потоковом решении для парсинга всегда используется постоянный объём памяти. В остальных решениях потребление памяти зависит от размера входных данных. У msgspec потребление памяти значительно меньше, и это решение намного быстрее.

Плюсы и минусы парсинга со схемой

В msgspec, указав схему, можно создавать объекты Python только для нужных нам полей. То есть потребление оперативной памяти меньше, а декодирование быстрее. Не нужно тратить время или память на создание тысяч бесполезных объектов Python.

Кроме того, проверку схемы мы получили просто так. Если в одной из записей не хватает поля или присутствует значение неверного типа, например целочисленного вместо строкового, парсер укажет бы на это, а в стандартных библиотеках JSON проверка схемы выполняется отдельно.

  • Потребление памяти при декодировании по-прежнему зависит от входного файла. А в потоковых парсерах JSON, таких как ijson, можно использовать постоянную память во время парсинга, каким бы большим ни был входной файл.
  • Указание схемы подразумевает написание большего объёма кода и меньшую гибкость при работе с неполными данными.

Data Science и Machine Learning

Python, веб-разработка

Мобильная разработка

От основ — в глубину

Источник

Loading a JSON File in Python – How to Read and Parse JSON

Dillion Megida

Dillion Megida

Loading a JSON File in Python – How to Read and Parse JSON

In this article, you’ll learn how to read and parse JSON in Python.

What is JSON?

JSON is short for JavaScript Object Notation. It’s a simple syntax for storing data in name-value pairs. Values can be different data types as long as they are valid. Non-acceptable types for JSON include functions, dates, and undefined .

JSON files are stored with the .json extension with a valid JSON structure.

Here’s what the structure of a JSON file looks like:

You’ll often use JSON to send and receive data from a server in web applications.

When the data is received, the program reads and parses the JSON to extract specific data. Different languages have their own methods for doing this. We’ll look at how to do these in Python here.

How to Read JSON Files

Let’s say the JSON in the code block above is stored in a user.json file. Using the open() inbuilt function in Python, we can read that file and assign the content to a variable. Here’s how:

with open('user.json') as user_file: file_contents = user_file.read() print(file_contents) #

You pass the file path to the open method which opens the file and assigns the stream data from the file to the user_file variable. Using the read method, you can pass the text contents of the file to the file_contents variable.

Читайте также:  Календарь на странице html

I used with at the beginning of the expression so that after reading the contents of the file, Python can close the file.

file_contents now contains a stringified version of the JSON. As a next step, you can now parse the JSON.

How to Parse JSON

Python has in-built modules for various operations. For managing JSON files, Python has the json module.

This module comes with many methods. One of which is the loads() method for parsing JSON strings. Then, you can assign the parsed data to a variable like this:

import json with open('user.json') as user_file: file_contents = user_file.read() print(file_contents) parsed_json = json.loads(file_contents) #

Using the loads() method, you can see that the parsed_json variable now has a valid dictionary. From this dictionary, you can access the keys and values in it.

Also notice how null from the JSON is converted to None in python. This is because null is not valid in Python .

How to Use json.load() to Read and Parse JSON Files

The json module also has the load method which you can use to read a file object and parse it at the same time. Using this method, you can update the previous code to this:

import json with open('user.json') as user_file: parsed_json = json.load(user_file) print(parsed_json) #

Instead of using the read method of the file object and using the loads method of the json module, you can directly use the load method which reads and parses the file object.

Wrapping Up

JSON data is commonly known for its simple structure and is popular (a standard in most cases) for information exchange between servers and clients.

Different languages and technologies can read and parse JSON files in different ways. In this article, we’ve learned how to read JSON files and parse such files using the read method of file objects, and the loads and load methods of the json module.

Dillion Megida

Dillion Megida

Developer Advocate and Content Creator passionate about sharing my knowledge on Tech. I simplify JavaScript / ReactJS / NodeJS / Frameworks / TypeScript / et al My YT channel: youtube.com/c/deeecode

If you read this far, tweet to the author to show them you care. Tweet a thanks

Learn to code for free. freeCodeCamp’s open source curriculum has helped more than 40,000 people get jobs as developers. Get started

freeCodeCamp is a donor-supported tax-exempt 501(c)(3) charity organization (United States Federal Tax Identification Number: 82-0779546)

Our mission: to help people learn to code for free. We accomplish this by creating thousands of videos, articles, and interactive coding lessons — all freely available to the public. We also have thousands of freeCodeCamp study groups around the world.

Donations to freeCodeCamp go toward our education initiatives, and help pay for servers, services, and staff.

Источник

Оцените статью