Some examples on working with YAML (‘YAML Ain’t Markup Language’) in Python3. In the examples, I am using PyYAML version 5.2 which can be installed using pip3 install pyyaml.
Emit a Python object as YAML
The dump method is used to serialize a Python object into a YAML stream. In the following example, we emit the Python dictionary as a string:
import yaml d = { 'string' : 'string', 'list': ['item-1', 'item-2',], 'nested-dictionary' : { 'key-1' : 'value-1', 'key-2' : 'value-2', }, 'True' : True, 'False' : False, 'None' : None, } print(yaml.dump(d, sort_keys=False))
This code will output the following:
string: string
list:
- item-1
- item-2
nested-dictionary:
key-1: value-1
key-2: value-2
'True': true
'False': false
None: null
Dump will automatically sort the keys for you. In the previous example, I used sort_keys=False to turn that off.
Write a Python object as YAML to a file:
We can also use the dump method to write a Python object to a file:
import yaml d = { 'key' : 'value' } with open("example.yaml", "w") as fh: yaml.dump(d, fh)
This example results in the following YAML file:
[root@said ~]$ more example.yaml key: value
Create a Python object from a YAML string
Using the load method, we can turn YAML into a Python object:
import yaml yaml_string = """ --- France: capital: Paris Italy: capital: Rome list_of_items: - item 1 - item 2 - item 3 """ python_object = yaml.load(yaml_string, Loader=yaml.SafeLoader) print(python_object)
This will output the following:
{'France': {'capital': 'Paris'}, 'Italy': {'capital': 'Rome'}, 'list_of_items': ['item 1', 'item 2', 'item 3']}
In case we want to use the load methods to generate a Python object from a file, we can use something like this:
import yaml yaml_file = "example.yaml" # key: value with open(yaml_file, "r") as fh: python_object = yaml.load(fh, Loader=yaml.SafeLoader) print(python_object)
The output of the script:
{'key': 'value'}
The loader
is relatively new and described here.
Instead of specifying the loader as an argument, we can also use the following methods to directly indicate what method to use to load the YAML:
- yaml.safe_load
- yaml.full_load
- yaml.unsafe_load
Using YAML in jinja
To use YAML data inside a Jinja template, you could do something like this:
import yaml from jinja2 import Template yaml_string = ''' --- - hostname: ny01 mgmt-ip: 10.0.0.1 - hostname: ny02 mgmt-ip: 10.0.0.2 ''' routers = yaml.full_load(yaml_string) template = Template(''' {% for router in routers %} hostname {{ router['hostname'] }} set interfaces lo0 unit 0 family inet address {{ router['mgmt-ip'] }} primary {% endfor %} ''') print(template.render(routers = routers))
Running the example script produces the following:
set system host-name ny01 set interfaces lo0 unit 0 family inet address 10.0.0.1 primary set system host-name ny02 set interfaces lo0 unit 0 family inet address 10.0.0.2 primary
Some YAML resources:
yaml.org
PyYAML documentation
PyYAML github
Online YAML Parser
noyaml
onlineyamltools can do a number of things:
- Validate YAML
- Turn YAML into JSON
- Make the YAML pretty