YAML (YAML Ain't Markup Language) - еще один текстовый формат для записи данных.
YAML более приятен для восприятия человеком, чем JSON, поэтому его часто используют для описания сценариев в ПО. Например, в Ansible.
Как и Python, YAML использует отступы для указания структуры документа. Но в YAML можно использовать только пробелы и нельзя использовать знаки табуляции.
Еще одна схожесть с Python: комментарии начинаются с символа # и продолжаются до конца строки.
Список может быть записан в одну строку:
[switchport mode access, switchport access vlan, switchport nonegotiate, spanning-tree portfast, spanning-tree bpduguard enable]
Или каждый элемент списка в своей строке:
- switchport mode access - switchport access vlan - switchport nonegotiate - spanning-tree portfast - spanning-tree bpduguard enable
Когда список записан таким блоком, каждая строка должна начинаться с -
(минуса и пробела), и все строки в списке должны быть на одном уровне отступа.
Словарь также может быть записан в одну строку:
{ vlan: 100, name: IT }
Или блоком:
vlan: 100 name: IT
Строки в YAML не обязательно брать в кавычки. Это удобно, но иногда всё же следует использовать кавычки. Например, когда в строке используется какой-то специальный символ (специальный для YAML).
Такую строку, например, нужно взять в кавычки, чтобы она была корректно воспринята YAML:
command: "sh interface | include Queueing strategy:"
Словарь, в котором есть два ключа: access и trunk. Значения, которые соответствуют этим ключам - списки команд:
access: - switchport mode access - switchport access vlan - switchport nonegotiate - spanning-tree portfast - spanning-tree bpduguard enable trunk: - switchport trunk encapsulation dot1q - switchport mode trunk - switchport trunk native vlan 999 - switchport trunk allowed vlan
Список словарей:
- BS: 1550 IT: 791 id: 11 name: Liverpool to_id: 1 to_name: LONDON - BS: 1510 IT: 793 id: 12 name: Bristol to_id: 1 to_name: LONDON - BS: 1650 IT: 892 id: 14 name: Coventry to_id: 2 to_name: Manchester
Для работы с YAML в Python используется модуль PyYAML. Он не входит в стандартную библиотеку модулей, поэтому его нужно установить:
pip install pyyaml
Работа с ним аналогична модулям csv и json.
Попробуем преобразовать данные из файла YAML в объекты Python.
Файл info.yaml:
- BS: 1550 IT: 791 id: 11 name: Liverpool to_id: 1 to_name: LONDON - BS: 1510 IT: 793 id: 12 name: Bristol to_id: 1 to_name: LONDON - BS: 1650 IT: 892 id: 14 name: Coventry to_id: 2 to_name: Manchester
Чтение из YAML (файл yaml_read.py):
import yaml from pprint import pprint with open('info.yaml') as f: templates = yaml.load(f) pprint(templates)
Результат:
$ python yaml_read.py [{'BS': 1550, 'IT': 791, 'id': 11, 'name': 'Liverpool', 'to_id': 1, 'to_name': 'LONDON'}, {'BS': 1510, 'IT': 793, 'id': 12, 'name': 'Bristol', 'to_id': 1, 'to_name': 'LONDON'}, {'BS': 1650, 'IT': 892, 'id': 14, 'name': 'Coventry', 'to_id': 2, 'to_name': 'Manchester'}]
Формат YAML очень удобен для хранения различных параметров, особенно, если они заполняются вручную.
Запись объектов Python в YAML (файл yaml_write.py):
import yaml trunk_template = ['switchport trunk encapsulation dot1q', 'switchport mode trunk', 'switchport trunk native vlan 999', 'switchport trunk allowed vlan'] access_template = ['switchport mode access', 'switchport access vlan', 'switchport nonegotiate', 'spanning-tree portfast', 'spanning-tree bpduguard enable'] to_yaml = {'trunk':trunk_template, 'access':access_template} with open('sw_templates.yaml', 'w') as f: yaml.dump(to_yaml, f) with open('sw_templates.yaml') as f: print(f.read())
Файл sw_templates.yaml выглядит таким образом:
access: [switchport mode access, switchport access vlan, switchport nonegotiate, spanning-tree portfast, spanning-tree bpduguard enable] trunk: [switchport trunk encapsulation dot1q, switchport mode trunk, switchport trunk native vlan 999, switchport trunk allowed vlan]
По умолчанию список записался в одну строку. Это можно изменить.
Для того, чтобы изменить формат записи, надо добавить параметр default_flow_style=False
(файл yaml_write_default_flow_style.py):
import yaml trunk_template = ['switchport trunk encapsulation dot1q', 'switchport mode trunk', 'switchport trunk native vlan 999', 'switchport trunk allowed vlan'] access_template = ['switchport mode access', 'switchport access vlan', 'switchport nonegotiate', 'spanning-tree portfast', 'spanning-tree bpduguard enable'] to_yaml = {'trunk':trunk_template, 'access':access_template} with open('sw_templates.yaml', 'w') as f: yaml.dump(to_yaml, f, default_flow_style=False) with open('sw_templates.yaml') as f: print f.read()
Теперь содержимое файла sw_templates.yaml выглядит таким образом:
access: - switchport mode access - switchport access vlan - switchport nonegotiate - spanning-tree portfast - spanning-tree bpduguard enable trunk: - switchport trunk encapsulation dot1q - switchport mode trunk - switchport trunk native vlan 999 - switchport trunk allowed vlan