我有一个yaml文件,如下所示:
# The following key opens a door
key: value
在维护评论的同时,我是否可以load
和dump
这些数据?
答案 0 :(得分:69)
如果你使用的是块结构化的YAML,你可以使用python包¹ruamel.yaml,这是PyYAML的衍生物,支持往返保存评论:
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)
结果:
# example
name:
# details
family: Smith # very common
given: Bob # one of the siblings
请注意,行尾注释仍然是对齐的。
list
不包含普通dict
和code
个对象,而是包含附加注释的包装版本。
¹使用pip install ruamel.yaml
安装。适用于Python 2.6 / 2.7 / 3.3 +
子>
² ordereddict
用于映射,以保持排序
答案 1 :(得分:13)
PyYAML以极低的水平抛出评论(Scanner.scan_to_next_token
)。
虽然您可以调整或扩展它来处理整个堆栈中的注释,但这将是一个重大修改。 Dump
ing(= emit)注释似乎更容易,并且在ticket 114中讨论了旧的PyYAML错误跟踪器。
答案 2 :(得分:1)
我有一个pyyaml的分支就是这样做的。 https://github.com/pflarr/pyyaml
要使用注释构建yaml文件,您必须创建包含注释事件的事件流。目前仅在序列项和映射键之前允许注释。
这只适用于python3,我还没有将它移植到库的python2版本,但可以根据请求轻松实现。另外,这也应该很容易移植到C libyaml,因为python代码是一个简单的端口。