python3 получает вложенный словарь / свойство из файла yaml

#python-3.x #dictionary #properties #nested

#python-3.x #словарь #свойства #вложенный

Вопрос:

Я пытаюсь выяснить, как получить вложенные данные в виде словаря / свойства из файла yaml.

Приведенный ниже код работает, если я предоставляю функции только один уровень. пример :

 result = parse_yaml_file(config_yaml_file, 'section')
  

но не удается, если я пытаюсь что-то вроде :

 result = parse_yaml_file(yaml_file, 'section.sub-section')
  

или

 result = parse_yaml_file(yaml_file, '['section']['sub-section']')
  

код python3 :

 def parse_yaml_file(yml_file, section):
    print('section : '   section)
    data_dict = {}
    try:
        with open(yml_file) as f:
            data_dict = (yaml.load(f))
    except (FileNotFoundError, IOError):
        exit_with_error('Issue finding/opening '   yml_file)

    if not section:
        return data_dict
    else: 
        return data_dict.get(section)

result = parse_yaml_file(yaml_file, 'section.sub-section.property')
print(json.dumps(result, indent=4))
  

Возможно ли выполнить синтаксический анализ только части / раздела файла yaml?
Или просто извлекает один подраздел / свойство из проанализированного результата?

Я знаю, что могу получить это из словаря, например :

 data_dict['section']['sub-section']['property']
  

но я хочу, чтобы он был гибким, а не жестко запрограммированным, поскольку данные для захвата предоставляются в качестве аргумента функции.

Большое спасибо за вашу помощь.

Ответ №1:

Вы могли бы попробовать использовать библиотеку для поиска в проанализированном файле yaml, например dpath

https://pypi.org/project/dpath/

 
import yaml
import dpath.util


def parse_yaml(yml_file, section):
    with open(yml_file,'r') as f:
        data_dict = yaml.load(f)
        return  dpath.util.search(data_dict,section)


parse_yaml('file.yml','section/sub-section')

  

Комментарии:

1. Захватите код для свойства и сохраните древовидную структуру. Если вы предпочитаете запускать дерево в данном разделе, используйте get, а не search, и все. Еще раз спасибо.