在 Python 中解析 YAML 文件并访问数据?

Posted

技术标签:

【中文标题】在 Python 中解析 YAML 文件并访问数据?【英文标题】:Parsing a YAML file in Python, and accessing the data? 【发布时间】:2011-12-28 23:40:06 【问题描述】:

我是 YAML 新手,一直在寻找解析 YAML 文件和使用/访问解析后的 YAML 数据的方法。

我遇到过关于如何解析 YAML 文件的解释,例如 PyYAML tutorial、“How can I parse a YAML file in Python”、“Convert Python dict to object?”,但我没有找到一个简单的例子来说明如何从解析的 YAML 文件中访问数据。

假设我有一个 YAML 文件,例如:

 treeroot:
     branch1: branch1 text
     branch2: branch2 text

如何访问文本“branch1 text”?

"YAML parsing and Python?" 提供了一个解决方案,但我在访问更复杂的 YAML 文件中的数据时遇到了问题。而且,我想知道是否有一些标准方法可以从解析的 YAML 文件中访问数据,可能类似于“tree iteration”或“elementpath”符号或解析 XML 文件时使用的东西?

【问题讨论】:

How can I parse a YAML file in Python的可能重复 【参考方案1】:

由于 PyYAML 的 yaml.load() 函数将 YAML 文档解析为原生 Python 数据结构,因此您可以只通过键或索引访问项目。使用您链接的问题中的示例:

import yaml
with open('tree.yaml', 'r') as f:
    doc = yaml.load(f)

要访问branch1 text,您可以使用:

txt = doc["treeroot"]["branch1"]
print txt
"branch1 text"

因为,在您的 YAML 文档中,branch1 键的值在 treeroot 键下。

【讨论】:

我得到“TypeError:字符串索引必须是整数,而不是 str”。看来我不能使用字符串作为索引。 您可能正在尝试访问(索引)一个字符串。你可能走得太深了;您是否已经在尝试访问的元素? @sattu 我遇到了同样的错误,因为我在键和值之间没有任何空格,即“labelsize: 20”而不是“labelsize:20”【参考方案2】:

@Aphex 的解决方案仅供参考 -

万一你遇到-

YAMLLoadWarning:不推荐在没有 Loader=... 的情况下调用 yaml.load()

您可能想要使用Loader=yaml.FullLoaderLoader=yaml.SafeLoader 选项。

import yaml 

with open('cc_config.yml', 'r') as f:
    doc = yaml.load(f, Loader=yaml.FullLoader) # also, yaml.SafeLoader

txt = doc["treeroot"]["branch1"]
print (txt)

【讨论】:

以上是关于在 Python 中解析 YAML 文件并访问数据?的主要内容,如果未能解决你的问题,请参考以下文章

Python之ruamel.yaml模块详解

python操作yaml文件

01 python基础——python解析yaml类型文件

Python 读写和解析 YAML 文件格式

如何从使用 python 解析的 yaml 文件中调用和迭代值?

python yaml 文件解析及strrepr函数的说明