Введение
В современной разработке программного обеспечения данные часто хранятся и передаются в стандартизированных форматах. JSON (JavaScript Object Notation) и YAML (YAML Ain't Markup Language) — два наиболее популярных формата, используемых повсеместно: от ответов веб-API до файлов конфигурации приложений.
В этой лабораторной работе вы освоите базовые навыки работы с этими форматами в Python. Сначала вы воспользуетесь встроенным модулем json для чтения и записи данных. Затем вы познакомитесь с YAML как с более удобным для чтения человеком форматом и научитесь парсить его с помощью библиотеки ruamel.yaml. В завершение вы откроете для себя anyconfig — мощный инструмент, который упрощает управление конфигурациями, позволяя загружать данные из файлов различных форматов, не вникая в детали реализации каждого из них.
Работа с JSON
На этом этапе вы научитесь сериализовать и десериализовать данные JSON. JSON (JavaScript Object Notation) — это легковесный формат для хранения и передачи данных, который часто используется при обмене информацией между сервером и веб-страницей.
Примечание: Если вы еще не знакомы с работой в WebIDE (аналог VS Code), пожалуйста, изучите её в этой лабораторной работе.
Сначала запишем словарь Python в JSON-файл. Этот процесс называется сериализацией.
В файловом менеджере слева откройте файл json_handler.py и добавьте в него следующий код. Этот скрипт создаст новый файл с именем output.json.
## Запись JSON-файла: json.dump() записывает объект Python в формате JSON
import json
content = {"name": "Joe", "age": 20}
with open("output.json", "w") as f: ## Открываем файл в режиме записи
json.dump(content, f, indent=2) ## Записываем JSON с отступом в 2 пробела
Разберем код:
import json: импортирует встроенный модуль Python для работы с JSON.content = {"name": "Joe", "age": 20}: определяет словарь Python, который мы хотим сохранить.with open("output.json", "w") as f:: открывает файлoutput.jsonв режиме записи ("w").json.dump(content, f, indent=2): записывает словарьcontentв файлfв формате JSON. Аргументindent=2форматирует JSON с отступом в 2 пробела, что делает его более читаемым.
Теперь запустите скрипт в терминале, чтобы создать файл:
python3 json_handler.py
Вы не увидите вывода в консоли, но файл output.json будет создан. Вы можете просмотреть его содержимое с помощью команды cat:
cat output.json
Вы должны увидеть отформатированный JSON:
{
"name": "Joe",
"age": 20
}
Теперь давайте прочитаем JSON-файл и преобразуем его в объект Python. Этот процесс называется десериализацией. Мы прочитаем файл data.json, который уже подготовлен для вас.
Измените файл json_handler.py, добавив в него следующий код:
## Чтение JSON-файла: json.load() парсит JSON из объекта файла
import json
with open("data.json", "r") as f: ## Открываем файл в режиме чтения
content = json.load(f) ## Парсим JSON и получаем словарь/список Python
print(content)
Что делает новый код:
with open("data.json", "r") as f:: открывает существующий файлdata.jsonв режиме чтения ("r").content = json.load(f): парсит данные JSON из файла и преобразует их в словарь Python.print(content): выводит полученный словарь в консоль.
Снова запустите скрипт:
python3 json_handler.py
На этот раз в терминале отобразится словарь Python:
{'username': 'labex', 'id': 12345}
Работа с YAML
На этом этапе вы познакомитесь с YAML — форматом сериализации данных, разработанным для удобства чтения человеком. По сравнению с JSON, YAML зачастую проще редактировать вручную, он поддерживает комментарии, что делает его популярным выбором для конфигурационных файлов.
В Python нет встроенного парсера YAML, поэтому необходимо установить стороннюю библиотеку. Существуют две основные библиотеки: PyYaml и ruamel.yaml. Библиотека ruamel.yaml более точно соответствует спецификации YAML и лучше сохраняет комментарии и форматирование при изменении файлов. Мы будем использовать её в этой работе.
Сначала установите ruamel.yaml с помощью pip:
pip install ruamel.yaml
Вы увидите сообщение об успешной установке.
Теперь используем эту библиотеку для чтения файла config.yaml. Откройте файл yaml_handler.py в редакторе и добавьте следующий код:
## Чтение YAML-файла с помощью библиотеки ruamel.yaml
from ruamel.yaml import YAML
with open("config.yaml") as f:
yaml=YAML() ## Создаем экземпляр парсера YAML
data = yaml.load(f) ## Парсим YAML и получаем словарь/список Python
print(data)
Разберем код:
from ruamel.yaml import YAML: импортирует необходимый классYAMLиз библиотеки.with open("config.yaml") as f:: открывает файлconfig.yamlдля чтения.yaml=YAML(): создает экземпляр парсера YAML.data = yaml.load(f): парсит содержимое YAML из файла и преобразует его в объект Python (в данном случае — в словарь).print(data): выводит загруженные данные.
Выполните скрипт в терминале:
python3 yaml_handler.py
Результатом будет представление содержимого YAML-файла в виде словаря Python:
{'user': {'name': 'Alex', 'email': 'alex@example.com'}}
Использование Anyconfig
На этом этапе вы познакомитесь с пакетом anyconfig — очень удобной библиотекой, которая абстрагирует формат конфигурационного файла. Она позволяет загружать словарь Python из различных форматов, таких как JSON, YAML, TOML и других, используя одну простую функцию. Это крайне полезно, когда ваше приложение должно поддерживать несколько форматов конфигурации.
Сначала установите anyconfig. Поскольку anyconfig требует бэкенд для парсинга YAML, а мы уже установили ruamel.yaml, библиотека автоматически воспользуется им.
Установите anyconfig с помощью pip:
pip install anyconfig
После завершения установки вы можете использовать anyconfig для загрузки конфигурационных файлов. Давайте используем его для загрузки того же файла config.yaml из предыдущего шага.
Откройте файл anyconfig_handler.py и добавьте следующий код:
## anyconfig: загрузка конфигурационных файлов в различных форматах (JSON, YAML, TOML и т.д.)
import anyconfig
## anyconfig.load() автоматически определяет формат файла по расширению.
conf = anyconfig.load("/home/labex/project/config.yaml")
print(conf)
Этот код гораздо проще:
import anyconfig: импортирует библиотеку.anyconfig.load(...): эта единственная функция открывает, читает и парсит файл. Она автоматически определяет, чтоconfig.yaml— это YAML-файл, и использует соответствующий парсер. Обратите внимание, что мы используем абсолютный путь — это хорошая практика, если расположение скрипта может меняться.
Теперь запустите скрипт:
python3 anyconfig_handler.py
Поскольку в этом примере мы по-прежнему загружаем config.yaml, вывод идентичен предыдущему шагу, но код стал более лаконичным и гибким.
{'user': {'name': 'Alex', 'email': 'alex@example.com'}}
С помощью anyconfig вы также можете заменить "config.yaml" на "data.json" и перезапустить скрипт. Код продолжит работать без каких-либо других изменений, но выведенный словарь будет отражать содержимое data.json, а не YAML-файла.
Резюме
В этой лабораторной работе вы научились работать с двумя распространенными форматами сериализации данных в Python: JSON и YAML. Эти навыки являются фундаментальными для таких задач, как работа с веб-API, управление конфигурациями приложений и обмен данными.
Вы начали с работы со встроенным модулем json, используя json.dump() для сериализации словаря Python в JSON-файл и json.load() для десериализации JSON-файла обратно в объект Python.
Затем вы изучили YAML как более читаемую альтернативу JSON. Вы узнали, как установить библиотеку ruamel.yaml и использовать её для парсинга YAML-файлов.
Наконец, вы познакомились с библиотекой anyconfig — мощным инструментом, упрощающим управление конфигурациями. Вы увидели, как функция anyconfig.load() позволяет считывать данные из файлов разных форматов без необходимости писать специфичный для каждого формата код, что делает ваши приложения более гибкими и простыми в поддержке.



