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

标签 python yaml ruamel.yaml

我有一个 Python 程序,它正在解析许多 YAML 文件,其中一些包含注释、 anchor 、引用和合并键,当我将 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 ,包括注释和合并键。我想知道当 YAML 以 OrderedDict 形式解析时是否可以访问这些注释和其他键。我需要将这些 YAML 文件转换为中间类型,因此能够获取和设置注释、合并键、 anchor 和引用是一个高优先级。

最佳答案

是的,您可以访问注释等。您的映射(python dict)将加载到 CommentedMap 的实例中,并且您的序列(python list) 在 CommentedSeq 的实例中。这些是 ordereddictCommentedBase 的子类。 listCommentedBase

CommentedBase有几个附加注释、合并、 anchor 和流式信息的属性。它还具有多种设置/获取这些值的方法,这些方法依赖于某些 map /序列特定的辅助函数。

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

请注意:

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

该接口(interface)的文档记录不足,主要是因为库作者的懒惰。你最好看看tests for commentsanchors得到一些例子。该界面还需要对属性内容级别进行一些更改,例如允许将 EOL 注释附加到键以及键+值组合。以下 YAML 不会按照您的预期/正确地进行往返:

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

因此,请务必包装您需要的功能,以便在 ruamel.yaml 中的接口(interface)以向后不兼容的方式发生更改时,您可以在一个点进行更改。

关于python - Ruamel.yaml:如何访问加载的 OrderedDict 中的合并键和注释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36224176/

相关文章:

python - 根据列表索引绘制列表值

java - 删除 YAML 文件中键值对之前的破折号

ruby - 使用 Ruby 在 YAML 文档中搜索/检查值

python - 使用 ruamel.yaml 加载和转储多个 yaml 文件 (python)

python - 使用 Python 在 YAML 中获取重复键

python - 如何 json 解析 python 输出并将其值存储在 dict 或变量中?

python - 如何使用 App Engine 获取 Jinja2 中继承模板的特定回溯?

ruby-on-rails - 从 YAML 加载 ActiveRecord 对象时出现反序列化错误

python - 我可以在 ruamel.yaml 的 CommentedMap 中插入一行吗?

python - 正则表达式-捕获标点符号和缩写