用'!'解析YAML。通过Pyyaml标记-序列节点解析

问题描述 投票:0回答:1

我正在解析YAML文件。我能够读取数据并使用嵌套字典访问它们。但是我尝试检索序列节点数据或带有seq标签的数据,但无法通过扫描,解析或加载来解析相同的数据。

YAML示例

version: !schema 'v1'
version_major: 1
version_minor: 0
version_patch: 0
description:
  more_info: bar
  short_description: foo
depends: !EvaluatableList
- !dependency 'avb@/1.0.0': !And [!Equals [!Ref 'asdf::selected',
      true], !NotEquals [!Ref 'fddg’, wwer]

在上述yaml中,我无法访问带有'!'感叹号的字符串。需要这些来验证相等或不相等的条件。输出字典也不会读取有关“!”标记的信息。

阅读PyYAML文档后,我无法检索与上述内容有关的任何信息。

请让我知道是否有可能阅读以上内容。

python-3.x yaml pyyaml
1个回答
0
投票

您使用了错误的文档和错误的库。

如果要了解!,则应查阅YAML 1.2 documentation。那个角色表示node tag

PyYAML无法处理YAML 1.2,它仅解析YAML 1.1(并且仅加载YAML 1.1的一部分)。

您要使用的是ruamel.yaml(免责声明:我是该包)。您可以将其安装在python虚拟环境中使用:pip install ruamel.yaml

之后,您可以访问键'version'的值,就好像您是从YAML中加载字典一样文档和其他带标签的条目适当地作为字典或列表:

import sys
import ruamel.yaml

yaml_str = """\
version: !schema 'v1'
version_major: 1
version_minor: 0
version_patch: 0
description:
  more_info: bar
  short_description: foo
depends: !EvaluatableList
- !dependency 'avb@/1.0.0': !And [!Equals [!Ref 'asdf::selected', 
     true], !NotEquals [!Ref 'fddg', wwer]]
"""

yaml = ruamel.yaml.YAML()
data = yaml.load(yaml_str)
print(data['version'])
dep = data['depends'][0]
for k in dep:
    print(k)
    for v in dep[k]:
        print(' ', v[0], v[1])

给出:

v1
avb@/1.0.0
  asdf::selected True
  fddg wwer

yaml.load()也可以被赋予文件句柄(为读取)或pathlib.Path(即实例Path实例,load将执行openeing)。

[请注意,我更改了YAML文件的最后一行。该fddg之后的字符不是单引号和另一个结尾需要使用括号来平衡该映射中的流样式序列

© www.soinside.com 2019 - 2024. All rights reserved.