Python перебирает YAML - PullRequest
       12

Python перебирает YAML

1 голос
/ 13 марта 2019

Как можно выполнить итерацию:

A:
  A1: 1000
  A2:
    A2A:
      A2A1: 100
      A2A2: 250
      A2A3: 250
    A2B:
      A2B1: 100
      A2B2: 300
   A3:
     A3A:
       A3A1:
         A3A1A: 200
         A3A1B: 100
         # There could be more values

Я хочу добавить значения A3A1A и A3A1B и другие значения в том же месте

Я попробовал следующее:

    with open("foobar.yml", 'r') as stream:
            foobar = yaml.load(stream)
    end_value = 0
        for one_value in foobar["A1"]["A3"]["A3A"] ["A3A1"][*]:
           end_value = end_value + one_value 

но это не работает

1 Ответ

2 голосов
/ 14 марта 2019

Здесь есть несколько проблем:

  • Ваш YAML недействителен. Клавиша A3 не совпадает с A2 (или A2B). Я предполагаю Вы хотите, чтобы он выровнялся с A2
  • ключ в отображении корневого уровня - A, а не A1, поэтому вы должны начать с foobar['A'] для обхода структуры данных.
  • не существует такой вещи, как [*] используйте .items() для получения пар ключ-значение или .values() для получить только значения вложенного отображения / dict
  • Ваш оператор for имеет неверный отступ
  • вы используете load() PyYAML, который задокументирован как потенциально небезопасный, и там нет необходимости использовать его. Используйте safe_load() или обновите до ruamel.yaml, что дает Вы YAML 1.2 и многое другое (отказ от ответственности: я автор ruamel.yaml)

например. Вы можете сделать:

import sys
import ruamel.yaml


yaml = ruamel.yaml.YAML(typ='safe')
with open('foobar.yaml') as fp:
  data = yaml.load(fp)

end_value = 0
for one_value in  data['A']['A3']['A3A']['A3A1'].values():
   end_value += one_value

print(end_value)

, что дает:

300
...