Как анализировать коллекции с помощью pyyaml ​​и получать значения - PullRequest
0 голосов
/ 15 января 2019

Мне удалось заставить простые, простые примеры анализа YAML работать нормально, но у меня возникли проблемы с вложенной структурой реального файла YAML, которую я должен проанализировать. У меня проблемы с просмотром коллекций. Я использую python3.6, ниже приведен фрагмент рудиментарного кода.

import yaml                                                    
with open('action.yml', 'r') as action:                        
    doc = yaml.load(action)                                    
    action = doc["actions"]["a1"]["action"]                    
    print (action)                                             
    tval = doc["actions"]["a1"]["add"]["filters[1]"]["value"]  
    print (tval)                                               
print ('done')

Ошибка времени выполнения выглядит следующим образом:

Traceback (most recent call last):                                  
  File "actionparser.py", line 27, in <module>                      
    tval = doc["actions"]["a1"]["add"]["filters[1]"]["value"]       
KeyError: 'filters[1]'                                              

Реальный входной файл YAML выглядит следующим образом. Как получить действия: a1: добавить: фильтры [1]: значение и действия: a2: добавить: фильтры [1]: значение

--- 
actions: 
  a1: 
    action: alias
    add: 
      filters: 
        - 
          filtertype: pattern
          kind: prefix
          value: logstash-
        - 
          filtertype: pattern
          kind: regex
          value: ^logstash-dev-firehbridge-cold    <== How do I get this?
        - 
          filtertype: pattern
          kind: timestring
          unit_count: 2
    description: "Add/Remove alias1"
    options: 
      disable_action: false
      ignore_empty_list: true
      name: current_firebridge
      warn_if_no_indices: true
    remove: 
      filters: 
        - 
          filtertype: pattern
          kind: prefix
          value: logstash-
        - 
          filtertype: pattern
          kind: regex
          value: ^logstash-dev-firehbridge-cold
        - 
          filtertype: pattern
          kind: timestring
          unit_count: 2
          value: "%Y.%m.%d"
  a2: 
    action: alias
    add: 
      filters: 
        - 
          filtertype: pattern
          kind: prefix
          value: logstash-
        - 
          filtertype: pattern
          kind: regex
          value: ^logstash-dev-firehbridge-hot    <== and how do I get this?
        - 
          filtertype: pattern
          kind: timestring
          unit_count: 2
    description: "Add/Remove alias2"
    options: 
      disable_action: false
      ignore_empty_list: true
      name: current_firebridge
      warn_if_no_indices: true
    remove: 
      filters: 
        - 
          filtertype: pattern
          kind: prefix
          value: logstash-
        - 
          filtertype: pattern
          kind: regex
          value: ^logstash-dev-firehbridge-hot
        - 
          filtertype: pattern
          kind: timestring
          unit_count: 2
          value: "%Y.%m.%d"

1 Ответ

0 голосов
/ 15 января 2019

Прежде всего: PyYAML по умолчанию .load() потенциально опасен и тебе это почти никогда не нужно. Вместо этого используйте .safe_load().

После загрузки вы получаете доступ к любому ключу сопоставления, используя питоны ['somekey'], синтаксис поиска ключей и любая последовательность, использующая индексирование записей списка ([somenumber]).

Предполагается, что ваш файл называется input.yaml (с удаленным <== How do I get this?:

import yaml

with open('input.yaml') as fp:
    data = yaml.safe_load(fp)
print(data['actions']['a1']['add']['filters'][1]['value'])
print(data['actions']['a2']['add']['filters'][1]['value'])

, что дает:

^logstash-dev-firehbridge-cold
^logstash-dev-firehbridge-hot
...