如何解析/读取YAML文件到Python对象?

Jam*_*han 96 python parsing yaml

如何解析/读取YAML文件到Python对象?

例如,这个YAML:

Person:
  name: XYZ
Run Code Online (Sandbox Code Playgroud)

对于这个Python类:

class Person(yaml.YAMLObject):
  yaml_tag = 'Person'

  def __init__(self, name):
    self.name = name
Run Code Online (Sandbox Code Playgroud)

我顺便使用PyYAML.

use*_*846 180

如果您的YAML文件如下所示:

# tree format
treeroot:
    branch1:
        name: Node 1
        branch1-1:
            name: Node 1-1
    branch2:
        name: Node 2
        branch2-1:
            name: Node 2-1
Run Code Online (Sandbox Code Playgroud)

你安装PyYAML得像这样:

pip install PyYAML
Run Code Online (Sandbox Code Playgroud)

Python代码如下所示:

import yaml
with open('tree.yaml') as f:
    # use safe_load instead load
    dataMap = yaml.safe_load(f)
Run Code Online (Sandbox Code Playgroud)

该变量dataMap现在包含一个包含树数据的字典.如果您dataMap使用PrettyPrint进行打印,您将获得以下内容:

{'treeroot': {'branch1': {'branch1-1': {'name': 'Node 1-1'},
    'name': 'Node 1'},
    'branch2': {'branch2-1': {'name': 'Node 2-1'},
    'name': 'Node 2'}}}
Run Code Online (Sandbox Code Playgroud)

所以,现在我们已经看到了如何将数据导入我们的Python程序.保存数据同样简单:

with open('newtree.yaml', "w") as f:
    yaml.dump(dataMap, f)
Run Code Online (Sandbox Code Playgroud)

你有一个字典,现在你必须将它转换为Python对象:

class Struct:
    def __init__(self, **entries): 
        self.__dict__.update(entries)
Run Code Online (Sandbox Code Playgroud)

然后你可以使用:

>>> args = your YAML dictionary
>>> s = Struct(**args)
>>> s
<__main__.Struct instance at 0x01D6A738>
>>> s...
Run Code Online (Sandbox Code Playgroud)

并按照" 将Python dict转换为对象 "进行操作.

有关更多信息,请查看pyyaml.orgthis.

  • @personal_cloud永远都不强。在嵌入式Docker容器中运行的Python应用程序(作为快速示例)可能会选择不使用virtualenv,因为它是一个额外的层,除了容器本身已经提供的功能之外,没有提供隔离。 (5认同)
  • 应该永远不要在virtualenv之外安装库. (2认同)
  • "pip install"是永久性的,请注意./sf/ask/108515851/ (2认同)

use*_*229 6

来自http://pyyaml.org/wiki/PyYAMLDocumentation:

add_path_resolver(tag, path, kind)添加基于路径的隐式标记解析程序.路径是形成表示图中节点的路径的键列表.路径元素可以是字符串值,整数或无.节点的类型可以是str,list,dict或None.

#!/usr/bin/env python
import yaml

class Person(yaml.YAMLObject):
  yaml_tag = '!person'

  def __init__(self, name):
    self.name = name

yaml.add_path_resolver('!person', ['Person'], dict)

data = yaml.load("""
Person:
  name: XYZ
""")

print data
# {'Person': <__main__.Person object at 0x7f2b251ceb10>}

print data['Person'].name
# XYZ
Run Code Online (Sandbox Code Playgroud)

  • virtualenv很酷,但是[pipenv](https://docs.pipenv.org/)很酷。 (2认同)

归档时间:

查看次数:

151405 次

最近记录:

6 年,10 月 前