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

Har*_*mbe 47 python yaml pyyaml

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

# The following key opens a door
key: value
Run Code Online (Sandbox Code Playgroud)

在保持评论的同时,我是否有办法loaddump这些数据?

Ant*_*hon 82

如果你使用的是块结构化的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)
Run Code Online (Sandbox Code Playgroud)

结果:

# example
name:
  # details
  family: Smith   # very common
  given: Bob      # one of the siblings
Run Code Online (Sandbox Code Playgroud)

请注意,行尾注释仍然是对齐的.

而不是普通的listdict对象code组成的评论所附的包装版本².

¹ 安装pip install ruamel.yaml.在映射的情况下使用Python 2.6/2.7/3.3 +
² ,以保持排序 ordereddict

  • @cerin圆形跳闸最初用于更新配置文件中的值,应始终有效.事物被"保留"的方式,如果你开始删除键,那么评论可能会消失.如果您在[so]上提出有关该问题的问题或提交错误报告,我更愿意.如果可以的话,我倾向于解决问题,并尝试提供解决方法,或者至少在不能解释的情况下解释. (6认同)
  • @cerin运行上面的代码时缺少哪些注释?使用什么版本的Python,ruamel.yaml以及在哪个平台上运行此代码?我只是用最新版本的ruamel.yaml重试了这个(如果我破坏了一些东西),输出仍然包含注释.考虑到这里的赞成量,我认为其他人已经能够得到相同的结果,并且你可能忽略了一些东西. (4认同)

phi*_*hag 15

PyYAML以非常低的水平抛出评论(in Scanner.scan_to_next_token).

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

  • 你说得对,这是一个重大修改,虽然更容易,因为我放弃了 < 2.6 支持并重新组合了 Py2 和 Py3 源。 (2认同)

小智 5

我有一个 pyyaml 分支正是这样做的。 https://github.com/pflarr/pyyaml

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

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