If you are using block structured YAML, you can use the python package1 ruamel.yaml which is a derivative of PyYAML and supports round trip preservation of comments:
import sys
import ruamel.yaml
yaml_str = """
# example
name:
# details
family: Smith # very common
given: Alice # one of the siblings
"""
yaml = ruamel.yaml.YAML() # defaults to round-trip if no parameters given
code = yaml.load(yaml_str)
code['name']['given'] = 'Bob'
yaml.dump(code, sys.stdout)
with result:
# example
name:
# details
family: Smith # very common
given: Bob # one of the siblings
Note that the end-of-line comments are still aligned.
Instead of normal list
and dict
objects the code
consists of wrapped versions2 on which the comments attached.
1 Install with pip install ruamel.yaml
. Works on Python 2.6/2.7/3.3+
2 ordereddict
is used in case of a mapping, to preserve ordering
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…