我有一个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文件转换为中间类型,因此能够get
和set
注释,合并键,锚点和引用都是高优先级。
答案 0 :(得分:1)
是的,您可以访问注释等。您的映射(python dict
)将在CommentedMap
的实例和您的序列(python list
)中加载到{ {1}}。这些是CommentedSeq
和ordereddict
的子类,resp。 CommentedBase
和list
。
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 comments和anchors以获取一些示例。该界面还需要对属性内容级别进行一些更改,例如允许将EOL注释附加到键以及键+值组合。以下YAML没有像您期望的那样往返:
#
因此,请确保包含您需要的功能,以便在abc: # this is the key
9989 # this is the value
中的接口以向后不兼容的方式更改时,您可以在其中进行更改。