Найти в Дзене
Simple Prog

Как использовать Python для парсинга файлов конфигурации?

Оглавление

Утро доброе. Сегодня мы поговорим о том, как использовать Python для парсинга файлов конфигурации (жаль не сайтов). Бывает, что программе нужно достаточно много параметров, а помещать их все в качестве аргументов командной строки или переменных среды неудобно и нерационально. В таких случаях используется файл конфигурации.

Ниже представленные самые популярные форматы файлов конфигурации:

  • почтенный (хотя иногда недостаточно определенный) формат INI,
  • популярный, но иногда сложный для написания вручную формат JSON,
  • обширный, но иногда удивительный в деталях формат YAML
  • и новейшее дополнение TOML, о котором многие люди не слышали. Пока что.

Ваша первая задача – выбрать формат, а затем задокументировать этот выбор. Разобравшись с этой простой частью, можно заняться парсингом конфигурации.

Иногда рекомендуется иметь класс, соответствующий «абстрактным» данным в конфигурации. Поскольку этот код ничего не делает с конфигурацией, это самый простой способ показать логику парсинга с синтаксической точки зрения.

Представьте себе конфигурацию файлового процессора: он включает в себя входной каталог, выходной каталог и файлы, которые нужно выбрать.

Абстрактное определение класса конфигурации может выглядеть примерно так:

Чтобы упростить код, зависящий от формата, можно написать функцию, которая парсит этот класс из словаря. Обратите внимание: здесь предполагается, что в конфигурации будут использоваться дефисы, а не символы подчеркивания. Такое несоответствие не редкость.

JSON

JSON (JavaScript Object Notation) – это формат, подобный JavaScript.

Вот пример конфигурации в формате JSON:

Логика парсинга «встраивает» JSON во встроенные структуры данных Python (словари, списки, строки) с помощью модуля json, а затем создает класс из словаря:

INI

Формат INI, изначально популярный в операционной системе Windows, стал де-факто стандартом конфигурации.

Вот такая конфигурация у нас получится на INI:

Python может парсить его с помощью встроенного модуля configparser. Парсер ведет себя как dict-подобный объект, поэтому его можно передать напрямую в configuration_from_dict:

YAML

YAML (Yet Another Markup Language) – это расширение JSON, которое упрощает написание кода вручную. Отчасти это достигается за счет длинной спецификации.

Вот такая конфигурация будет в YAML:

Чтобы Python запарсил это, вам необходимо установить сторонний модуль. Самый популярный — PyYAML (pip install pyyaml). Парсер YAML также возвращает встроенные типы данных Python, которые можно передать в configuration_from_dict. Однако YAML-парсер ожидает поток, поэтому вам нужно преобразовать строку в поток.

TOML

TOML (Tom’s Own Markup Language) разработан как легкая альтернатива YAML. Спецификация здесь короче. И такой формат уже кое-где популярен (например, менеджер пакетов Rust, Cargo, использует ее для конфигурации своих пакетов).

А вот так будет выглядеть наша конфигурация на TOML:

Чтобы запарсить TOML, вам необходимо установить сторонний пакет. Самый популярный из них называется просто toml. Он возвращает базовые типы данных Python.

Заключение

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

Узнали ли вы что-то новое из данной статьи или уже осведомлены о таких возможностях? Пишите обо всем в комментарии, будет интересно почитать. Также задавайте вопросы, я обязательно на них отвечу.

И наконец, если хотите больше познавательного контента - подписывайтесь на канал и ставьте лайки!