Python 3.x 在Python3中使用ruamel.Yaml解析Yaml嵌套配置
当使用Python包Python 3.x 在Python3中使用ruamel.Yaml解析Yaml嵌套配置,python-3.x,ruamel.yaml,Python 3.x,Ruamel.yaml,当使用Python包ruamel.YAML解析YAML配置文件时,我需要考虑到嵌套可以在同一YAML文件中以两种不同的样式进行描述: 通过使用新行和缩进 使用点(.) 简化示例: 跑 logging.yml main.py 实际产量: 是否可以以某种方式配置ruamel.yaml,使路径属性嵌套在日志->文件中,如下所述,以便以后可以轻松访问属性: { 'logging': { 'file': { 'name': 'app.log', 'path': '/lo
ruamel.YAML
解析YAML配置文件时,我需要考虑到嵌套可以在同一YAML文件中以两种不同的样式进行描述:
ruamel.yaml
,使路径
属性嵌套在日志->文件中,如下所述,以便以后可以轻松访问属性:
{
'logging': {
'file': {
'name': 'app.log',
'path': '/logs'
}
}
}
不可以,无法按照您的方式配置
ruamel.yaml
希望我甚至认为尝试创建一个构造函数是个坏主意。
这将在装载过程中实现您想要的功能,例如,这意味着您
在解析映射时需要考虑到这一点
这是键文件
的值,python dict可能已经存在
由于拆分logging.file.path
而存在
我建议您对数据进行后期处理
:
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'}}}
如果有必要,您可以递归地执行此操作,以防您使用
根级别上不存在的点。我不知道如何通过在数据上使用内置打印来获得实际输出,所有内容都应该显示在一行上。实际输出的漂亮打印只是为了可读性,而不是我在代码中关心的东西。我应该在帖子中提到这一点,很抱歉
{
'logging': {
'file': {
'name': 'app.log',
'path': '/logs'
}
}
}
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'}}}