Как я могу разобрать файл YAML в Python?
Как я могу разобрать файл YAML в Python
Ответы (8)
Самый простой и чистый метод без использования заголовков C - это PyYaml (документация), который можно установить с помощью pip install 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, как указано в этом ответе.
yaml.safe_load
, поскольку он не может выполнять произвольный код из файла YAML.
- person ternaryOperator; 07.03.2014
pip install pyyaml
, дополнительные параметры см. В этом сообщении stackoverflow.com/questions/14261614/
- person Romain; 26.09.2018
yaml.load
устарел, и его следует использовать с аргументом загрузчика, например. yaml.load(input, Loader=yaml.FullLoader)
. yaml.safe_load(input)
все еще в порядке. github.com/yaml/pyyaml/wiki/PyYAML-yaml .load (ввод) - Прекращение работы
- person Zuku; 17.02.2020
yaml.read()
api или тому подобное, которое возвращает dict?
- person alex; 11.06.2020
import yaml; from munch import munchify; f = munchify(yaml.load(…)); print(fo.d.try)
- person Hans Ginzel; 21.06.2020
Чтение и запись файлов YAML с помощью Python 2 + 3 (и юникода)
# -*- 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
€
в Windows - €
. Кто-нибудь знает причину?
- person Cloud Cho; 09.08.2019
io.open(doc_name, 'r', encoding='utf8')
, чтобы прочитать специальный символ. YAML версии 0.1.7
- person Cloud Cho; 09.08.2019
open(doc_name, ..., encodung='utf8')
для чтения и записи без импорта io
.
- person dexteritas; 13.08.2019
import yaml
, но это не встроенный модуль, и вы не указываете, какой это пакет. Запуск import yaml
на новой установке Python3 приводит к ModuleNotFoundError: No module named 'yaml'
- person cowlinator; 19.11.2019
Если у вас есть 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)
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe7 in position 926: ordinal not in range(128)
). Я пытался установить yaml.encoding на utf-8, но не работал, поскольку метод загрузки в YAML по-прежнему использует ascii_decode. Это ошибка?
- person SnwBr; 07.01.2020
Сначала установите pyyaml с помощью pip3.
Затем импортируйте модуль yaml и загрузите файл в словарь под названием my_dict:
import yaml
with open('filename.yaml') as f:
my_dict = yaml.safe_load(f)
Это все, что вам нужно. Теперь весь файл yaml находится в словаре my_dict.
!!python
), использование yaml.load()
также может быть небезопасным (как при полной очистке жесткого диска). Поскольку это четко задокументировано, вам следует повторить это предупреждение здесь (почти во всех случаях можно использовать yaml.safe_load()
).
- person Anthon; 23.08.2018
import yaml
, но это не встроенный модуль, и вы не указываете, какой это пакет. Запуск import yaml
на новой установке Python3 приводит к ModuleNotFoundError: No module named 'yaml'
- person cowlinator; 19.11.2019
import yaml; from munch import munchify; f = munchify(yaml.load(…)); print(fo.d.try)
- person Hans Ginzel; 21.06.2020
Пример:
defaults.yaml
url: https://www.google.com
environment.py
from ruamel import yaml
data = yaml.safe_load(open('defaults.yaml'))
data['url']
Чтобы получить доступ к любому элементу списка в файле YAML следующим образом:
global:
registry:
url: dtr-:5000/
repoPath:
dbConnectionString: jdbc:oracle:thin:@x.x.x.x:1521:abcd
Вы можете использовать следующий скрипт Python:
import yaml
with open("/some/path/to/yaml.file", 'r') as f:
valuesYaml = yaml.load(f, Loader=yaml.FullLoader)
print(valuesYaml['global']['dbConnectionString'])
Я использую 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, как оказалось, не мертв, он просто поддерживается в другом месте.