Python 3.x 在Python3中使用ruamel.Yaml解析Yaml嵌套配置

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

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

  • 通过使用新行和缩进
  • 使用点(.)
  • 简化示例:

    logging.yml

    main.py

    实际产量:

    是否可以以某种方式配置
    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'}}}