在Python3中使用ruamel.yaml解析Yaml嵌套配置

伊斯玛·斯洛米奇

使用Python软件包解析YAML配置文件时,ruamel.yaml我需要考虑到可以在同一YAML文件中以两种不同的样式描述嵌套:

  1. 通过使用换行和缩进
  2. 通过使用点(。)

简化示例:

运行repl.it代码段

logging.yml

# 1. by using new line and indents
logging: 
  file: 
    name: app.log
# 2. by using dots (.)
logging.file.path: /logs

main.py

#!/usr/bin/env python3

import ruamel.yaml as yaml

with open('logging.yml', 'r') as file:
  data = yaml.safe_load(file)
print(data)

实际输出

{
  'logging': {
    'file': {
      'name': 'app.log'
    }
  },
  'logging.file.path': '/logs'
}

是否可以通过ruamel.yaml某种方式进行配置,以便我可以如下所述将path属性嵌套在logging-> file中,以便以后可以轻松访问该属性?

{
  'logging': {
    'file': {
      'name': 'app.log',
      'path': '/logs'
    }
  }
}
安通

不,无法ruamel.yaml按照您想要的方式进行配置我什至认为尝试创建一个在加载过程中即时执行所需操作的构造函数是一个坏主意,因为例如,这意味着您在解析映射即键值时需要考虑到这一点file,拆分后可能已经存在一个python字典logging.file.path

我建议您对以下内容进行后处理data

from pprint import pprint
import ruamel.yaml

yaml_str = """\
logging: 
  file: 
    name: app.log
logging.file.path: /logs
"""


yaml = ruamel.yaml.YAML(typ='safe')
data = yaml.load(yaml_str)
for k in list(data.keys()):
    if not '.' in k:
        continue
    keys = k.split('.')
    d = data
    while len(keys) > 1:
        d = d.setdefault(keys.pop(0), {})
    d[keys[0]] = data.pop(k)
pprint(data, width=-1)

这使:

{'logging': {'file': {'name': 'app.log',
                      'path': '/logs'}}}

如有必要,您可以递归地执行此操作,以防万一您拥有在根级别不存在带点的键。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在Jekyll YAML配置中访问多个嵌套变量

来自分类Dev

如何解析 yaml 列表中的嵌套字典?

来自分类Dev

如何在python中使用ruamel.yaml从YAML文件中获取评论?

来自分类Dev

如何使用Python3将ruamel.yaml转换为dict?

来自分类Dev

python3 从 yaml 文件中获取嵌套字典/属性

来自分类Dev

在ocaml中解析yaml

来自分类Dev

在ocaml中解析yaml

来自分类Dev

python循环遍历yaml配置

来自分类Dev

使用YAML配置的R脚本

来自分类Dev

如何使用 Yaml 配置 Flyway?

来自分类Dev

Yaml python解析多个值

来自分类Dev

无法解析 yaml 文件 python

来自分类Dev

Rails 中的 YAML 解析问题

来自分类Dev

使用Shell解析YAML部分

来自分类Dev

使用 Jackson 解析 yaml 文件

来自分类Dev

YAML解析为对象(PyYAML Python3)

来自分类Dev

无法使用yaml.js将YAML解析为JSON

来自分类Dev

使用yaml-cpp解析json / yaml数组

来自分类Dev

使用yaml-cpp解析json / yaml数组

来自分类Dev

在Python中解析Yaml:检测重复的键

来自分类Dev

在Python中使用重复的锚点解析YAML

来自分类Dev

在Python中使用重复的锚点解析YAML

来自分类Dev

使用 ruamel.yaml 更新包含多个 yaml 的 yaml 文件中的 yaml 块

来自分类Dev

为YAML中的嵌套键设置值

来自分类Dev

使用 Handlebars 访问嵌套的 YAML/JSON 对象

来自分类Dev

Python `logging` 模块 + YAML 配置文件

来自分类Dev

Yaml和Symfony中复杂的关系配置

来自分类Dev

在ruamel from_yaml中使用construct_undefined

来自分类Dev

无法在Rstudio Knitr中成功解析YAML