Разбор файла YAML в Python и доступ к данным?

84

Я новичок в YAML и искал способы проанализировать файл YAML и использовать / получить доступ к данным из проанализированного YAML.

Я встречал объяснений о том , как разобрать файл YAML, например, PyYAML учебник , « Как я могу разобрать файл YAML в Python », « Преобразовать Python Dict на объект? », Но то , что я не нашел это простой пример того, как получить доступ к данным из проанализированного файла YAML.

Предположим, у меня есть файл YAML, например:

 treeroot:
     branch1: branch1 text
     branch2: branch2 text

Как мне получить доступ к тексту «текст ветки1»?

« Анализ YAML и Python? » Предоставляет решение, но у меня возникли проблемы с доступом к данным из более сложного файла YAML. И мне интересно, есть ли какой-нибудь стандартный способ доступа к данным из проанализированного файла YAML, возможно, что-то похожее на нотацию « итерация дерева » или « путь к элементам » или что-то, что могло бы использоваться при синтаксическом анализе файла XML?

9обезьян
источник
Возможный дубликат Как я могу разобрать файл YAML в Python
fmsf

Ответы:

152

Поскольку 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». Кажется, я не могу использовать строку для индекса.
сатту
Скорее всего, вы пытаетесь получить доступ к строке (индексировать ее). Возможно, вы зашли слишком глубоко; вы уже находитесь на элементе, к которому пытаетесь получить доступ?
Aphex
@sattu У меня была такая же ошибка, потому что у меня не было пробела между ключом и значением, то есть «labelize: 20» вместо «labelize: 20»
mateuszb