2016-03-25 34 views
1

我有一个Python程序解析一些YAML文件,其中一些包含注释,锚点,引用和合并键,我想保存当我将YAML文件加载到我的分析器中。 ruamel.yaml似乎有这些往返保存,当我运行以下命令:Ruamel.yaml:如何访问合并键和注释在加载OrderedDict

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文件转换为中间类型,因此能够同时处理getset注释,合并键,锚点和引用是高优先级。

回答

1

是的,你可以访问,评论等你映射(蟒蛇dict)将在CommentedMap一个实例和您在CommentedSeq实例序列(蟒蛇list)被加载。这些是ordereddictCommentedBase的子类,的listCommentedBase

CommentedBase有几个属性,将注释,合并,锚点和流式样信息附加到该属性。它还有几个方法设置/获取这些值,这些值依赖于某些映射/序列特定的辅助函数。

import sys 
import ruamel.yaml as yaml 

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

data = yaml.round_trip_load(yaml_str) 
data.yaml_add_eol_comment('comment 2', key='c') 
data.yaml_add_eol_comment('# comment 3', key='e', column=8) 
yaml.round_trip_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 

所以一定要包你需要这样有一个点,你可以修改的功能,如果在一ruamel.yaml变化的界面向后不兼容的方式。