Ruamel.yaml: 如何访问加载的 OrderedDict 中的合并键和注释

Ruamel.yaml: How to access merge keys and comments in loaded OrderedDict

我有一个 Python 程序正在解析许多 YAML 文件,其中一些包含注释、锚点、引用和合并键,我希望在将 YAML 文件加载到我的解析器时保留这些文件。 ruamel.yaml 当我 运行 以下内容时,似乎有这些往返保存:

with open(yaml_file, "r") as f:
    yaml = f.read()
parsed_yaml = ruamel.yaml.load(yaml, ruamel.yaml.RoundTripLoader)
print ruamel.yaml.dump(parsed_yaml,Dumper=ruamel.yaml.RoundTripDumper)

它打印出原始文件 yaml_file,因为它包含注释和合并键。我想知道在以 OrderedDict 形式解析 YAML 时我是否可以访问这些注释和其他键。我需要将这些 YAML 文件转换为中间类型,因此能够同时 getset 注释、合并键、锚点和引用是一个高优先级。

是的,您可以访问评论等。您的映射 (python dict) 将加载到 CommentedMap 的实例中,您的序列 (python list) 在 CommentedSeq 的实例中。这些分别是 ordereddictCommentedBase 的子类。 listCommentedBase.

CommentedBase 有几个属性,附加了评论、合并、锚点和流式信息。它还有几种方法 set/get 这些值依赖于一些 map/sequence 特定的辅助函数。

import sys
from ruamel.yaml import YAML

yaml_str = """\
a: 1   # comment 1
b: 2
c: 3
d: 4
e: 5
"""

yaml = YAML()
data = yaml.load(yaml_str)
data.yaml_add_eol_comment('comment 2', key='c')
data.yaml_add_eol_comment('#  comment 3', key='e', column=8)
yaml.dump(data, sys.stdout)

会给你:

a: 1   # comment 1
b: 2
c: 3   # comment 2
d: 4
e: 5    #  comment 3

请注意:

  • 如果您不指定起始列,则采用下一个先前评论的列。
  • 如果评论字符串尚未以该字符组合开头,将插入前导 # 和 space。
  • 标量和注释之间至少要有一个space。

接口文档不足,主要是因为库作者的懒惰。您最好查看 tests for comments and for anchors 以获得一些示例。该接口还需要对属性内容级别进行一些更改,例如允许将 EOL 注释附加到键以及键 + 值组合。以下 YAML 不会像您那样往返 expect/correctly:

abc:      # this is the key
    9989  # this is the value

因此请务必包装您需要的功能,这样如果 ruamel.yaml 中的界面以向后不兼容的方式更改,您可以在一个点上进行更改。