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 文件转换为中间类型,因此能够同时 get
和 set
注释、合并键、锚点和引用是一个高优先级。
是的,您可以访问评论等。您的映射 (python dict
) 将加载到 CommentedMap
的实例中,您的序列 (python list
) 在 CommentedSeq
的实例中。这些分别是 ordereddict
和 CommentedBase
的子类。 list
和 CommentedBase
.
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
中的界面以向后不兼容的方式更改,您可以在一个点上进行更改。
我有一个 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
注释、合并键、锚点和引用是一个高优先级。
是的,您可以访问评论等。您的映射 (python dict
) 将加载到 CommentedMap
的实例中,您的序列 (python list
) 在 CommentedSeq
的实例中。这些分别是 ordereddict
和 CommentedBase
的子类。 list
和 CommentedBase
.
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
中的界面以向后不兼容的方式更改,您可以在一个点上进行更改。