Прочитать файл YAML как список - PullRequest
6 голосов
/ 24 июня 2019

У меня есть файл YAML, который выглядит как (просто пример):

a:
    b: 1    
a:
    b: 2    
    c: 1
a:
    b: 3

Я хочу прочитать этот файл и кое-что сделать с b s и c s. Проблема в том, что я не могу прочитать этот файл как словарь, используя yaml.load(), так как он даст мне только {'a':{'b': 3 }}. Вместо этого я хочу прочитать его как список словарей, т.е. я хочу, чтобы вывод был примерно таким:

[
    {'a':{'b': 1 }},
    {'a':{'b': 2, 'c': 1 }},
    {'a':{'b': 3 }}
]

Как мне этого добиться? Спасибо ...

Ответы [ 2 ]

2 голосов
/ 25 июня 2019

В последней спецификации YAML (1.2, от 2009 г.) совершенно ясно, что ключи в отображении нельзя дублировать:

Содержимое узла сопоставления представляет собой неупорядоченный набор пар узлов ключ: значение с ограничением уникальности каждого из ключей.

Как указано, ваш файл не является допустимым файлом YAML, и его загрузка должна дать вам DuplicateKeyError.

Поскольку вы знаете, что хотите получить, самый простой способ узнать, что YAML будет загружать таким образом, - это сбросить структуру данных:

import sys
import ruamel.yaml

yaml = ruamel.yaml.YAML()
data = [
    {'a':{'b': 1 }},
    {'a':{'b': 2, 'c': 1 }},
    {'a':{'b': 3 }}
]
yaml.dump(data, sys.stdout)

, что дает:

- a:
    b: 1
- a:
    b: 2
    c: 1
- a:
    b: 3
1 голос
/ 25 июня 2019

Используйте фрагмент ниже как YAML

a:
    - b: 1    
    - b: 2    
      c: 1
    - b: 3

И получите этот диктет в python (не нужно дублировать 'a')

{
  "a": [
    {
      "b": 1
    }, 
    {
      "c": 1, 
      "b": 2
    }, 
    {
      "b": 3
    }
  ]
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...