在PyYAML中保存/转储带有注释的YAML文件

时间:2011-08-31 10:50:05

标签: python yaml pyyaml

我有一个yaml文件,如下所示:

# The following key opens a door
key: value

在维护评论的同时,我是否可以loaddump这些数据?

3 个答案:

答案 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不包含普通dictcode个对象,而是包含附加注释的包装版本。

¹使用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代码是一个简单的端口。