Как я могу разобрать файл YAML в Python?
Как я могу разобрать файл YAML в Python?
Ответы:
Самым простым и чистым методом без использования заголовков C является PyYaml ( документация ), который можно установить с помощью pip install pyyaml
:
#!/usr/bin/env python
import yaml
import json
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, как указано в этом ответе .
pip install pyyaml
см. В этом сообщении stackoverflow.com/questions/14261614/…
# -*- 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)
a list:
- 1
- 42
- 3.141
- 1337
- help
- €
a string: bla
another dict:
foo: bar
key: value
the answer: 42
.yml
а также .yaml
Для вашего приложения может быть важно следующее:
Смотрите также: Сравнение форматов сериализации данных
Если вы предпочитаете создавать файлы конфигурации, вы можете прочитать мою короткую статью Файлы конфигурации в Python
€
на Windows есть €
. Кто-нибудь знает причину?
io.open(doc_name, 'r', encoding='utf8')
чтобы прочитать специальный символ. YAML версия 0.1.7
open(doc_name, ..., encodung='utf8')
для чтения и записи, без импорта io
.
Если у вас есть 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. Это ошибка?
Сначала установите 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()
можно использовать).
import yaml
, но это не встроенный модуль, и вы не указываете, какой это пакет. Запуск import yaml
на новой установке Python3 приводит кModuleNotFoundError: No module named 'yaml'
Пример:
defaults.yaml
url: https://www.google.com
environment.py
from ruamel import yaml
data = yaml.safe_load(open('defaults.yaml'))
data['url']
Я использую 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 не мертв, как оказалось, он просто поддерживается в другом месте.
#!/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:]))
yaml.safe_load
поскольку он не может выполнить произвольный код из файла YAML.