Как я могу проанализировать YAML файл в Python

Как я могу проанализировать YAML файл в Python?

Ответ 1

Самый простой и чистый способ без использования заголовков C - это PyYaml (документация):

#!/usr/bin/env python

import yaml

with open("example.yaml", 'r') as stream:
    try:
        print(yaml.safe_load(stream))
    except yaml.YAMLError as exc:
        print(exc)

И это все. Также существует простая функция yaml.load(), но всегда предпочтительнее использовать yaml.safe_load(), если вам явно не нужна произвольная сериализация/десериализация объекта, чтобы избежать возможности произвольного выполнения кода.

Обратите внимание, что проект PyYaml поддерживает версии вплоть до спецификации YAML 1.1. Если требуется поддержка спецификации YAML 1.2, см. ruamel.yaml, как указано в этом ответе.

Ответ 2

Чтение и запись файлов YAML с Python 2 + 3 (и Unicode)

# -*- coding: utf-8 -*-
import yaml
import io

# Define data
data = {'a list': [1, 42, 3.141, 1337, 'help', u'€'],
        'a string': 'bla',
        'another dict': {'foo': 'bar',
                         'key': 'value',
                         'the answer': 42}}

# Write YAML file
with io.open('data.yaml', 'w', encoding='utf8') as outfile:
    yaml.dump(data, outfile, default_flow_style=False, allow_unicode=True)

# Read YAML file
with open("data.yaml", 'r') as stream:
    data_loaded = yaml.safe_load(stream)

print(data == data_loaded)

Создан YAML файл

a list:
- 1
- 42
- 3.141
- 1337
- help
- €
a string: bla
another dict:
  foo: bar
  key: value
  the answer: 42

Общие окончания файлов

.yml и .yaml

альтернативы

Для вашего приложения может быть важно следующее:

  • Поддержка другими языками программирования
  • Чтение/запись производительности
  • Компактность (размер файла)

Смотрите также: Сравнение форматов сериализации данных

Если вы ищете способ создания файлов конфигурации, вы можете прочитать мою короткую статью Файлы конфигурации в Python

Ответ 3

Если у вас есть YAML, который соответствует спецификации YAML 1.2 (выпущен в 2009 году), вам следует использовать ruamel.yaml (выражение об отказе: я являюсь автором этого пакета). По сути, это расширенный набор PyYAML, который поддерживает большую часть YAML 1.1 (с 2005 года).

Если вы хотите сохранить свои комментарии при циклическом переключении, вам, безусловно, следует использовать ruamel.yaml.

Обновление примера @Jon легко:

import ruamel.yaml as yaml

with open("example.yaml") as stream:
    try:
        print(yaml.safe_load(stream))
    except yaml.YAMLError as exc:
        print(exc)

Используйте safe_load() если вы действительно не имеете полного контроля над вводом, нуждаетесь в этом (редко бывает) и не знаете, что делаете.

Если вы используете Pathlib Path для манипулирования файлами, вам лучше использовать новый API ruamel.yaml:

from ruamel.yaml import YAML
from pathlib import Path

path = Path('example.yaml')
yaml = YAML(typ='safe')
data = yaml.load(path)

Ответ 4

Импортируйте модуль yaml и загрузите файл в словарь под названием "my_dict":

import yaml
my_dict = yaml.load(open('filename'))

Это все, что вам нужно. Теперь весь файл yaml находится в словаре my_dict.

Ответ 5

Пример:


defaults.yaml

url: https://www.google.com

environment.py

from ruamel import yaml

data = yaml.safe_load(open('defaults.yaml'))
data['url']

Ответ 6

Я использую ruamel.yaml. Подробности и дебаты здесь.

from ruamel import yaml

with open(filename, 'r') as fp:
    read_data = yaml.load(fp)

Использование ruamel.yaml совместимо (с некоторыми простыми разрешимыми проблемами) со старым использованием PyYAML и, как указано в приведенной мной ссылке, используйте

from ruamel import yaml

вместо

import yaml

и это решит большинство ваших проблем.

РЕДАКТИРОВАТЬ: PyYAML не мертв, как оказалось, он просто поддерживается в другом месте.

Ответ 7

#!/usr/bin/env python

import sys
import yaml

def main(argv):

    with open(argv[0]) as stream:
        try:
            #print(yaml.load(stream))
            return 0
        except yaml.YAMLError as exc:
            print(exc)
            return 1

if __name__ == "__main__":
    sys.exit(main(sys.argv[1:]))

Ответ 8

Используйте PyYml для импорта файла ymal.