Розбір файлу YAML у Python та доступ до даних?


83

Я новачок у YAML і шукав шляхи синтаксичного аналізу файлу YAML та використання / доступу до даних із проаналізованого YAML.

Я натрапив на пояснення, як проаналізувати файл YAML, наприклад, підручник з PyYAML , " Як я можу проаналізувати файл YAML у Python ", " Перетворити Python dict на об'єкт? ", Але те, що я не знайшов, це простий приклад того, як отримати доступ до даних із проаналізованого файлу YAML.

Припустимо, у мене є файл YAML, такий як:

 treeroot:
     branch1: branch1 text
     branch2: branch2 text

Як отримати доступ до тексту "text1 branch"?

" Синтаксичний аналіз YAML та Python? " Пропонує рішення, але у мене були проблеми з доступом до даних із більш складного файлу YAML. І мені цікаво, чи існує якийсь стандартний спосіб доступу до даних із проаналізованого файлу YAML, можливо щось подібне до " ітерації дерева " або позначення " шлях до елемента " чи щось, що буде використано при аналізі XML-файлу?


Відповіді:


151

Оскільки yaml.load()функція PyYAML аналізує документи YAML до власних структур даних Python, ви можете просто отримати доступ до елементів за ключем або індексом. На прикладі запитання, яке ви зв’язали:

import yaml
with open('tree.yaml', 'r') as f:
    doc = yaml.load(f)

Для доступу branch1 textви використовуєте:

txt = doc["treeroot"]["branch1"]
print txt
"branch1 text"

оскільки у вашому документі YAML значення branch1ключа знаходиться під treerootключем.


3
Я отримую "TypeError: індекси рядків повинні бути цілими числами, а не str". Здається, я не можу використовувати рядок для індексу.
sattu

Ви, ймовірно, намагаєтеся отримати доступ (індексувати) до рядка. Можливо, ви заглиблюєтесь занадто глибоко; Ви вже перебуваєте в елементі, до якого ви намагаєтесь отримати доступ?
Aphex

@sattu У мене була та ж помилка, оскільки у мене не було пробілу між ключем та значенням, тобто "labelsize: 20" замість "labelsize: 20"
mateuszb
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.