Как я могу проанализировать 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
альтернативы
- CSV: супер простой формат (чтение и запись)
- JSON: Отлично подходит для написания удобочитаемых данных; ОЧЕНЬ широко используется (чтение и запись)
- YAML: YAML - это расширенный набор JSON, но его легче читать (чтение и запись, сравнение JSON и YAML).
- pickle: формат сериализации Python (чтение и запись)
- MessagePack (пакет Python): более компактное представление (чтение и запись)
- HDF5 (пакет Python): отлично подходит для матриц (чтение и запись)
- XML: существует тоже * вздох * (чтение и запись)
Для вашего приложения может быть важно следующее:
- Поддержка другими языками программирования
- Чтение/запись производительности
- Компактность (размер файла)
Смотрите также: Сравнение форматов сериализации данных
Если вы ищете способ создания файлов конфигурации, вы можете прочитать мою короткую статью Файлы конфигурации в 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.