我有一个看起来像这样的 yaml 文件:
# The following key opens a door
key: value
有没有办法在维护评论的同时获取这些数据load
?dump
如果您使用的是块结构的 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
PyYAML 在非常低的级别(在 中Scanner.scan_to_next_token
)丢弃注释。
虽然您可以调整或扩展它以处理其整个堆栈中的注释,但这将是一个重大修改。Dump
ing(=发射)评论似乎更容易,并在旧 PyYAML 错误跟踪器的票 114中进行了讨论。
截至 2020 年,关于添加对加载评论的支持的功能请求仍然停滞不前。
我有一个 pyyaml 分支可以做到这一点。 https://github.com/pflarr/pyyaml
要构建带有评论的 yaml 文件,您必须创建一个包含评论事件的事件流。目前仅允许在序列项和映射键之前进行注释。
这目前仅适用于 python3,我还没有将它移植到库的 python2 版本,但可以根据要求轻松完成。此外,这也应该很容易移植到 C libyaml,因为无论如何 python 代码都是一个简单的移植。