Yml файл что это python

Обновлено: 03.07.2024

YAML — это язык для сериализации данных, который отличается простым синтаксисом и позволяет хранить сложноорганизованные данные в компактном и читаемом формате. Рассказываем, как это пригодится для DevOps и виртуализации.

Что такое YAML?

YAML — это язык для хранения информации в формате понятном человеку. Его название расшифровывается как, «Ещё один язык разметки». Однако, позже расшифровку изменили на — «YAML не язык разметки», чтобы отличать его от настоящих языков разметки.

Язык похож на XML и JSON, но использует более минималистичный синтаксис при сохранении аналогичных возможностей. YAML обычно применяют для создания конфигурационных файлов в программах типа Инфраструктура как код (Iac), или для управления контейнерами в работе DevOps.

Чаще всего с помощью YAML создают протоколы автоматизации, которые могут выполнять последовательности команд записанные в YAML-файле. Это позволяет вашей системе быть более независимой и отзывчивой без дополнительного внимания разработчика.

Cube Dev , Удалённо , От 8000 $

Всё больше и больше компаний используют DevOps и виртуализацию, поэтому YAML — это must have для современного разработчика. Кроме того, YAML легко интегрировать, благодаря поддержке Python (используя PyYAML библиотеку, Docker или Ansible) и других популярных технологий.

YAML vs JSON vs XML

YAML (.yml)

  • понятный человеку код;
  • минималистичный синтаксис;
  • заточен под работу с данными;
  • встроенный стиль, похожий на JSON (YAML является его надмножеством);
  • поддерживает комментарии;
  • поддерживает строки без кавычек;
  • считается «чище», чем JSON;
  • дополнительные возможности (расширяемые типы данных, относительные якоря и маппинг типов с сохранением порядка ключей).

Применение: YAML лучше всего подходит для приложений с большим объемом данных, которые используют DevOps конвейеры или виртуальные машины. Кроме того, улучшение читаемости данных пригодится в командах, где разработчики часто с ними взаимодействуют.

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

Применение: XML идеален для сложных проектов, которым требуется тонкий контроль над валидацией, схемой и пространством имён. Язык обладает плохой читаемостью, требует большей пропускной способности и ёмкости хранилища, но обеспечивает беспрецедентный контроль.

Характерные особенности YAML

Поддержка мультидокументов

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

Документы разделяются тремя дефисами (—):

Поддержка комментариев

Легко читаемый синтаксис

В синтаксисе YAML-файлов используется система отступов, как в Python. Необходимо использовать пробелы, а не табуляцию, чтобы избежать путаницы.

Это избавляет от лишних символов, которые есть в JSON и XML (кавычки, скобки, фигурные скобки).

В итоге читаемость файла значительно повышается.

Явная и неявная типизация

YAML предлагает как автоопределение типов, так и возможность явно указать тип данных. Чтобы использовать конкретный тип, нужно написать !![тип] перед значением.

Отсутствие исполняемых файлов

YAML не содержит исполняемых файлов. Поэтому можно безопасно обмениваться YAML-файлами с третьей стороной.

Чтобы использовать исполняемые файлы, YAML нужно интегрировать с другими языками, например Perl или Java.

Синтаксис YAML

В языке есть несколько базовых концепций, которые позволяют обрабатывать большинство данных.

Пары ключ-значение

Большинство данных в YAML-файле хранятся в виде пары ключ-значение, где ключ — это имя пары, а значение — связанные данные.

Скаляры и маппинг

Скаляр представляет собой одно значение, которому соответствует имя.

YAML поддерживает стандартные типы: int и float, boolean, string и null.

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

Строки

Строка — это коллекция символов, которая может содержать слово или предложение. Можно использовать либо |, для отдельных строк, либо >, для параграфов.

Кавычки в YAML не нужны.

Последовательности

Последовательности — это структуры данных похожие на списки или массивы, которые хранят несколько значений под одним ключом. Они определяются с помощью отступов или [].

Однострочные последовательности выглядят лаконичнее, но хуже читаются.

Словари

Словари — это коллекции пар ключ-значение, которые хранятся под одним ключом. Они позволяют разделить данные на логические категории.

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

В этом руководстве мы узнаем, как использовать библиотеку YAML в Python 3. В последние годы она стала очень популярной благодаря использованию для хранения данных в виде сериализованных файлов конфигурации. Поскольку YAML по сути является форматом данных, библиотека YAML довольно простая, поскольку единственная необходимая функциональность – это возможность анализировать файлы в формате YAML.

В этой статье мы начнем с рассмотрения того, как данные хранятся в файле YAML, а затем загрузим эти данные в объект Python. Наконец, мы узнаем, как сохранить объект Python в файле YAML.

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

Установка

Процесс установки YAML довольно прост. Это можно сделать двумя способами, начнем с простого.

Метод 1: через точку

Самый простой способ установить библиотеку YAML в Python – через диспетчер пакетов pip. Если в вашей системе установлен pip, выполните следующую команду, чтобы загрузить и установить YAML:

Метод 2: через источник

Если у вас не установлен pip или у вас возникли проблемы с описанным выше методом, вы можете перейти на исходную страницу библиотеки. Загрузите репозиторий в виде zip-файла, откройте терминал или командную строку и перейдите в каталог, в который загружен файл. Когда вы окажетесь там, выполните следующую команду:

Примеры кода

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

Чтение файлов

В этом разделе мы увидим, как читать файлы YAML в Python. Начнем с создания двух файлов в формате YAML.

Содержимое первого файла выглядит следующим образом:

Содержимое второго файла выглядит следующим образом:

Вы можете видеть, что файлы fruit.yaml и category.yaml содержат разные типы данных. Первый содержит информацию только об одном объекте, то есть о фруктах, а второй содержит информацию о видах спорта и странах.

Давайте теперь попробуем прочитать данные из двух файлов, которые мы создали с помощью скрипта Python. Метод load() из модуля yaml можно использовать для чтения файлов YAML. Взгляните на следующий скрипт:

В приведенном выше скрипте мы указали yaml.FullLoader в качестве значения для параметра Loader, который загружает полный язык YAML, избегая выполнения произвольного кода. Вместо использования функции загрузки и последующей передачи yaml.FullLoader в качестве значения параметра Loader вы также можете использовать функцию full_load(), как мы увидим в следующем примере.

Давайте теперь попробуем прочитать второй файл YAML аналогичным образом, используя скрипт Python:

Поскольку в файле category.yaml 2 документа, мы выполнили цикл, чтобы прочитать их оба.

Как видно из последних двух примеров, библиотека автоматически обрабатывает преобразование данных в формате YAML в словари и списки Python.

Запись

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

Метод dump() принимает словарь Python как первый, а объект File как второй параметр.

После выполнения приведенного выше кода в вашем текущем рабочем каталоге будет создан файл с именем store_file.yaml.

Еще одна полезная функция, которую предлагает библиотека YAML для метода dump(), – это параметр sort_keys. Чтобы показать, что он делает, применим его к нашему первому файлу, то есть fruit.yaml:

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

Заключение

В этом кратком руководстве мы узнали, как установить библиотеку Python YAML (pyyaml) для управления файлами в формате YAML. Мы рассмотрели загрузку содержимого файла YAML в нашу программу Python в виде словарей, а также сериализацию словарей и сохранение их ключей. Библиотека довольно краткая и предлагает только основные функции.

Пример явного документа YAML:

Пример неявного документа YAML:

Пример нескольких документов в одном файле .yaml :

Разметка списков в документе YAML.

Последовательности блоков могут быть вложенными:

Нет необходимости начинать вложенную последовательность с новой строки:

Последовательность блоков может быть вложена в словарь блоков. Обратите внимание, что в этом случае нет необходимости делать отступы для блока с последовательностью.

Разметка словарей в документе YAML.

Словари из блоков могут быть вложенными:

Словари из блоков могут быть вложенными в список блоков:

Якоря и псевдонимы в документе YAML.

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

Модуль PyYAML теперь полностью поддерживает рекурсивные объекты. Например, следующий документ YAML создаст объект списка, содержащий ссылку на себя.

Теги документа YAML и типы Python.

Теги могут быть неявными:

А могут быть явными:

В следующей таблице описывается, как узлы с разными тегами преобразуются в объекты Python.

Тэг YAMLТип Python
Стандартный тэг YAML
!!null None
!!bool bool
!!int int
!!float float
!!binary bytes
!!timestamp datetime.datetime
!!omap, !!pairs список пар кортежей
!!set set
!!str str
!!seq list
!!map dict
Специфичные для Python теги
!!python/none None
!!python/bool bool
!!python/bytes bytes
!!python/str str
!!python/unicode str
!!python/int int
!!python/long int
!!python/float float
!!python/complex complex
!!python/list list
!!python/tuple tuple
!!python/dict dict
Сложные теги Python
!!python/name:module.name module.name
!!python/module:package.module package.module
!!python/object:module.cls module.cls экземпляр
!!python/object/new:module.cls module.cls экземпляр
!!python/object/apply:module.f значение f(. )

Функции и модули.

Чтобы представить статические объекты Python, такие как функции или классы, необходимо использовать сложный тег !!python/name .

Например, функция yaml.dump() может быть представлена следующим образом:

Аналогично, модули представляются с помощью тега !python/module :

Пользовательские объекты Python.

Любой сериализуемый объект может быть сериализован с помощью тега !!python/object :

Для поддержки протокола pickle предусмотрены две дополнительные формы тега !!python/object :

Если только поле args непустое, то вышеприведенные записи можно сократить:

YAML расшифровывается как Yet Another Mark-up Language, что означает «Еще один язык разметки». Этот формат файлов сейчас очень популярен для хранения сериализованных данных, которые достаточно удобочитаемы для человека.

Такой формат в основном используется для файлов конфигурации, но может применяться и для других целей. Содержимым такого файла могут быть различные типы скалярных данных, например число, строка и т.д. Так же это могут быть составные данные, такие как список или словарь. Расширение YAML-файлов – .yaml .

Для начала

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

Чтобы установить PyYAML, выполните следующую команду:

pip install pyyaml

Создание файла YAML

Для дальнейшей работы нам понадобится файл с содержимым, как в примере ниже. Создайте его и назовите client.yaml.

Пример 1. Чтение содержимого YAML после преобразования объекта Python

После установки пакета PyYAML модуль YAML можно импортировать в скрипт для чтения содержимого YAML путем преобразования объекта Python.

Для создания содержимого YAML (путем сериализации содержимого объекта Python) используется функция dump() модуля yaml.

Давайте напишем код для генерации и вывода в консоль потока YAML путем преобразования содержимого объекта Python. По умолчанию функция dump() сортирует содержимое словаря на основе ключей.

После запуска кода мы получим следующий результат:

Элементы всех словарей списка Python преобразованы в элементы содержимого YAML. При этом вывод отсортирован по ключам словаря. Поэтому значение ключа author было выведено первым, а значение ключа price – последним.

Пример 2. Чтение содержимого из файла YAML

В данном примере мы будем использовать файл client.yaml, созданный ранее.

Напишем следующий код для чтения отсортированного на основе ключей содержимого файла client.yaml .

Функция load() используется для чтения полного содержимого нашего файла. Эта функция вернет содержимое файла в виде списка словарей Python. Затем функция dump() преобразует список в поток YAML, который мы после выведем в консоль.

При запуске этого кода получим следующий вывод:

Пример 3. Чтение ключей и значений из файла YAML

Обратите внимание, что содержимое файла не отсортировано, поскольку мы не использовали функцию dump() .

Пример 4. Чтение содержимого YAML-файла в список словарей

Функция safe_load() используется для преобразования содержимого файла YAML в список словарей Python. Эту функцию также можно использовать для загрузки данных из ненадежных источников.

Давайте напишем код для загрузки содержимого файла YAML (с помощью функции safe_load() ) и вывода загруженного содержимого в консоль.

В выводе получаем список словарей:

Заключение

В этой статье мы на нескольких примерах разобрали, как читать файлы YAML в Python. Конечно, с практикой придёт большее понимание, как работать с библиотекой PyYAML. А сейчас можно запустить код из примеров, которые мы привели выше, и удостовериться, что тема чтения файлов YAML полностью понятна.

Мы все любим Ansible, но Ansible – это YAML. Для конфигурационных файлов существует масса форматов: списки значений, пары «параметр-значение», INI-файлы, YAML, JSON, XML и множество других. Однако по нескольким причинам из всех них YAML часто считается особенно трудным. В частности, несмотря на его освежающий минимализм и впечатляющие возможности для работы с иерархическими значениями, синтаксис YAML может раздражать своим Python-образными подходом к отступам.


Если вас бесит YAML, вы можете – и должны! – предпринять 10 следующих шагов, чтобы снизить свое раздражение до приемлемого уровня и полюбить YAML. Как и положено настоящему списку, наша десятка советов будет нумероваться с нуля, медитацию и духовные практики добавляем по желанию ;-)

0. Заставьте ваш редактор работать

Неважно, какой у вас текстовый редактор – для него наверняка существует хотя бы один плагин для работы с YAML. Если у вас такого нет, немедленно найдите и установите. Потраченное на поиск и настройку время будет многократно окупаться каждый раз, когда вам придется редактировать YAML.

Например, редактор Atom поддерживает YAML по умолчанию, а вот для GNU Emacs придется установить дополнительные пакеты, например, yaml-mode.


Emacs в режиме YAML и отображения пробелов.

Если в вашем любимом редакторе нет режима YAML, то часть проблем можно решить, поработав с настройками. Например, штатный для GNOME текстовый редактор Gedit не имеет режима YAML, но по умолчанию подсвечивает синтаксис YAML и позволяет настроить работу с отступами:


Настройка отступов в Gedit.

А плагин drawspaces для Gedit отображает пробелы в виде точек, устраняя неясности с уровнями отступа.

Иными словами, потратьте время на изучение своего любимого редактора. Выясните, что он сам или его сообщество разработки предлагают для работы с YAML, и используйте эти возможности. Вы точно об этом не пожалеете.

1. Используйте линтер (linter)

В идеале языки программирования и языки разметки используют предсказуемый синтаксис. Компьютеры хорошо справляются с предсказуемостью, поэтому еще в 1978 году возникла концепция линтера. Если за 40 лет своего существования она прошла мимо вас и вы до сих пор не пользуетесь YAML-линтером, то самое время попробовать yamllint.

Установить yamllint можно с помощью штатного менеджера пакетов Linux. Например, в Red Hat Enterprise Linux 8 или Fedora это делается так:


Затем вы просто запускаете yamllint, передавая ему YAML-файл для проверки. Вот как это выглядит, если передать линтеру файл с ошибкой:


Цифры слева – это не время, а координаты ошибки: номер строки и столбца. Описание ошибки может вам ни о чем не говорить, зато вы точно знаете, где она находится. Просто посмотрите на это место в коде, и, скорее всего, все станет ясно.

Когда yamllint не находит ошибок в файле, на экран ничего не выводится. Если вас пугает такая тишина и хочется немного больше обратной связи, то можно запускать линтер с условной командой echo через двойной амперсанд (&&), вот так:


В POSIX двойной амперсанд срабатывает тогда и только тогда, когда предшествующая команда возвращает 0. А yamllint как раз возвращает количество найденных ошибок, поэтому вся эта условная конструкция и работает.

2. Пишите на Python, а не на YAML

Если вас реально бесит YAML, просто не пишите на нем, в буквальном смысле. Бывает, что YAML – это единственный формат, который воспринимается приложением. Но и в этом случае необязательно создавать YAML-файл. Пишите на том, что вам нравится, а потом конвертируйте. Например, для Python есть отличная библиотека pyyaml и целых два способа конвертирования: самоконвертирование и конвертирование через скрипты.

Самоконвертирование

В этом случае файл с данными заодно является и Python-скриптом, который генерирует YAML. Этот способ лучше всего подходит для небольших наборов данных. Вы просто пишите JSON-данные в переменную Python, предваряете это директивой import, а в конце файла добавляете три строчки для реализации вывода.


Теперь запускаем это файл на Python-е и на выходе получаем файл output.yaml:

Конвертирование через скрипты

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


Затем создадим простой скрипт-конвертор и сохраним его под именем json2yaml.py. Этот скрипт импортирует оба модуля — YAML и JSON Python, а также загружает указанный пользователем файл JSON, выполняет конвертирование и пишет данные в файл output.yaml.


Сохраните этот скрипт в system path и запускайте по мере необходимости:

3. Парсите много и часто

Иногда на проблему полезно взглянуть под другим углом. Если вам трудно представить взаимосвязи между данными в YAML, можно временно преобразовать их в нечто более привычное.

Например, если вам удобно работать со словарными списками или с JSON, то YAML можно преобразовать в JSON всего двумя командами в интерактивной оболочке Python. Допустим, у вас есть YAML-файл mydata.yaml, тогда вот как это будет выглядеть:


На эту тему можно найти массу других примеров. Кроме того, в наличии множество онлайн-конвертеров и локальных парсеров. Так что не стесняйтесь переформатировать данные, когда видите в них только непонятную мешанину.

4. Читайте спеки

5. Псевдоконфиги

При написании книги или статьи всегда полезно сперва набросать предварительный план, хотя бы в виде оглавления. Так же и с YAML. Скорее всего, вы представляете, какие данные надо записать в файл YAML, но не очень понимаете, как связать их друг с другом. Поэтому прежде чем ваять YAML, нарисуйте псевдоконфиг.

Псевдоконфиг похож на псевдокод, где не надо заботиться о структуре или отступах, отношениях «родитель-потомок», наследовании и вложенности. Так и здесь: вы рисуете итерации данных по мере того, как они возникают у вас в голове.


Псевдоконфиг с перечислением программистов (Martin и Tabitha) и их навыков (языков программирования: Python, Perl, Pascal и Lisp, Fortran, Erlang, соответственно).

Нарисовав псевдоконфиг на листе бумаги, внимательно проанализируйте его и, если все в порядке, оформите в виде валидного YAML-файла.

6. Дилемма «табуляция или пробелы»

Вам придется решить дилемму «табуляция или пробелы?». Не в глобальном смысле, а лишь на уровне вашей организации, или хотя бы проекта. Неважно, будет ли при этом использоваться пост-обработка скриптом sed, настройка текстовых редакторов на машинах программистов или же поголовное взятие расписок о строгом соблюдении указаний линтера под угрозой увольнения, но все члены вашей команды, которые так или иначе касаются YAML, в обязательном порядке должны использовать только пробелы (как того требует спецификация YAML).

В любом нормальном текстовом редакторе можно настроить автозамену табуляции на заданное количество пробелов, поэтому бунта приверженцев клавиши Tab можно не бояться.

Как хорошо известно каждому ненавистнику YAML, на экране не видно разницы между табуляцией и пробелами. А когда чего-то не видно, об этом, как правило, вспоминают в последнюю очередь, после того, как перебрали, проверили и устранили все остальные возможные проблемы. Час времени, убитый на поиск кривой табуляции или блока пробелов, просто вопиет о том, что вам над срочно создать политику использования того или другого, а затем реализовать железобетонную проверку ее соблюдения (например, через Git-хук для принудительного прогона через линтер).

7. Лучше меньше да лучше (или больше – это меньше)

Некоторые люди любят писать на YAML, поскольку он подчеркивает структуру. При этом они активно используют отступы, чтобы выделять блоки данных. Это такое своего рода жульничество для имитации языков разметки, в которых используются явные разделители.

Вот пример такой структурированности из документации Ansible:


Кому-то такой вариант помогает разложить в голове структуру YAML, других он наоборот раздражает массой ненужных, на их взгляд, отступов.

Но если вы являетесь владельцем YAML-документа и отвечаете за его сопровождение, то вы и только вы должны определять, как использовать отступы. Если вас раздражают большие отступы, сведите их к минимуму, который только возможен согласно спецификации YAML. Например, вышеприведенный файл из документации Ansible без каких бы то ни было потерь можно переписать вот так:

8. Используйте заготовки

Если при заполнении файла YAML вы постоянно повторяете одни и те же ошибки, имеет смысл вставить в него шаблон-заготовку в виде комментария. Тогда в следующий раз можно будет просто скопировать эту заготовку и вписать туда реальные данные, например:

9. Используйте что-то другое

Если приложение не держит вас мертвой хваткой, то, возможно, стоит сменить YAML на другой формат. Со временем конфигурационные файлы могут перерастать себя и тогда лучше преобразовать их в простые скрипты на Lua или Python.

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

Если же без YAML никак не обойтись, то возьмите на вооружение эти 10 советов и победите свою неприязнь к YAML раз и навсегда!

Читайте также: