YAML in Python: Difference between revisions
Jump to navigation
Jump to search
Line 32: | Line 32: | ||
=Serialize YAML= | =Serialize YAML= | ||
{{Internal|Serializing YAML with PyYAML#Overview|Serializing YAML with PyYAML}} | |||
<syntaxhighlight lang='python'> | <syntaxhighlight lang='python'> | ||
import yaml | import yaml |
Revision as of 22:50, 7 December 2022
Internal
PyYAML
PyYAML provides YAML serialization/deserialization in Python.
Installation
pip install pyyaml
requirements.txt
:
pyyaml == 5.3.1
To install, see the "Installation" section from https://pyyaml.org/wiki/PyYAMLDocumentation.
Overview
Deserialize YAML
import yaml
with open('some-file.yaml', 'rt') as f:
content = f.read()
data = yaml.load(content, Loader=yaml.Loader)
Serialize YAML
import yaml
# with the default flow style, the document is rendered in a non-indented manner
print (yaml.dump(data, default_flow_style=False))
YAML Serialization Configuration
Suggestions on how to safely recursively navigate a complex data structure:
Representers
Configure yaml.dump() to render blank instead of null
PyYAML dump()
uses Representer()
to represent None
. By default, the representer dump()
is configured with represents None
as "null". To change that:
1. Define a method that "represents" None
def representer_for_none(self, _):
return self.represent_scalar('tag:yaml.org,2002:null', '')
2. Add it to the module:
import yaml
[...]
yaml.add_representer(type(None), represent_none)
This will render:
d = {
'a': None,
'b': 'c'
}
as:
a:
b: c
what is the lifecycle of the method registered to the module?
Configure yaml.dump() to render | multi-lines
def literal_presenter(dumper, data):
return dumper.represent_scalar('tag:yaml.org,2002:str', data, style='|')
def default_presenter(dumper, data):
return dumper.represent_scalar('tag:yaml.org,2002:str', data, style='')
try:
yaml.add_representer(str, literal_presenter)
yaml_text = yaml.dump(config)
return yaml_text
finally:
yaml.add_representer(str, default_presenter)