59

我有一个看起来像这样的 yaml 文件:

# The following key opens a door
key: value

有没有办法在维护评论的同时获取这些数据loaddump

4

3 回答 3

107

如果您使用的是块结构的 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

请注意,行尾注释仍然对齐。

不是普通的listdict对象,而是code由附有评论的包装版本²组成。

¹安装pip install ruamel.yaml. 适用于 Python 2.6/2.7/3.3+
²用于映射,以保持排序 ordereddict

于 2014-11-24T10:59:26.047 回答
29

PyYAML 在非常低的级别(在 中Scanner.scan_to_next_token)丢弃注释。

虽然您可以调整或扩展它以处理其整个堆栈中的注释,但这将是一个重大修改。Dumping(=发射)评论似乎更容易,并在旧 PyYAML 错误跟踪器的票 114中进行了讨论。

截至 2020 年,关于添加对加载评论的支持的功能请求仍然停滞不前。

于 2011-08-31T10:59:43.183 回答
4

我有一个 pyyaml 分支可以做到这一点。 https://github.com/pflarr/pyyaml

要构建带有评论的 yaml 文件,您必须创建一个包含评论事件的事件流。目前仅允许在序列项和映射键之前进行注释。

这目前仅适用于 python3,我还没有将它移植到库的 python2 版本,但可以根据要求轻松完成。此外,这也应该很容易移植到 C libyaml,因为无论如何 python 代码都是一个简单的移植。

于 2018-01-10T17:00:52.573 回答