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

时间:2016-03-25 16:44:50

标签: python yaml ruamel.yaml

我有一个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注释,合并键,锚点和引用都是高优先级。

1 个答案:

答案 0 :(得分:1)

是的,您可以访问注释等。您的映射(python dict)将在CommentedMap的实例和您的序列(python list)中加载到{ {1}}。这些是CommentedSeqordereddict的子类,resp。 CommentedBaselist

CommentedBase有几个属性,可以附加注释,合并,锚点和流式样信息。它还有几种设置/获取这些值的方法,这些方法依赖于某些特定于map / sequence的辅助函数。

CommentedBase

会给你:

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 和空格。
  • 标量和评论之间至少有一个空格。

界面未被记录,主要是因为图书馆作者的懒惰。您最好查看tests for commentsanchors以获取一些示例。该界面还需要对属性内容级别进行一些更改,例如允许将EOL注释附加到键以及键+值组合。以下YAML没有像您期望的那样往返:

#

因此,请确保包含您需要的功能,以便在abc: # this is the key 9989 # this is the value 中的接口以向后不兼容的方式更改时,您可以在其中进行更改。