Как я могу разобрать файл YAML в Python?
612
Самым простым и чистым методом без использования заголовков 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, как указано в этом ответе .
yaml.safe_load
поскольку он не может выполнить произвольный код из файла YAML.pip install pyyaml
см. В этом сообщении stackoverflow.com/questions/14261614/…Чтение и запись файлов YAML с Python 2 + 3 (и Unicode)
Создан YAML файл
Общие окончания файлов
.yml
а также.yaml
альтернативы
Для вашего приложения может быть важно следующее:
Смотрите также: Сравнение форматов сериализации данных
Если вы предпочитаете создавать файлы конфигурации, вы можете прочитать мою короткую статью Файлы конфигурации в Python
источник
€
на Windows есть€
. Кто-нибудь знает причину?io.open(doc_name, 'r', encoding='utf8')
чтобы прочитать специальный символ. YAML версия 0.1.7open(doc_name, ..., encodung='utf8')
для чтения и записи, без импортаio
.Если у вас есть YAML, который соответствует спецификации YAML 1.2 (выпущен в 2009 году), вам следует использовать ruamel.yaml (заявление об отказе от ответственности: я являюсь автором этого пакета). По сути, это расширенный набор PyYAML, который поддерживает большую часть YAML 1.1 (с 2005 года).
Если вы хотите сохранить свои комментарии при циклическом переключении, вам, безусловно, следует использовать ruamel.yaml.
Обновление примера @ Jon легко:
Используйте,
safe_load()
если у вас нет полного контроля над входом, он нужен (редко бывает) и знает, что вы делаете.Если вы используете pathlib
Path
для манипулирования файлами, вам лучше использовать новый API ruamel.yaml:источник
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»:
Это все, что вам нужно. Теперь весь файл yaml находится в словаре my_dict.
источник
!!python
), он также может быть небезопасным (как в случае полной очистки жесткого диска) для использованияyaml.load()
. Поскольку это четко задокументировано, вы должны повторить это предупреждение здесь (почти во всех случаяхyaml.safe_load()
можно использовать).import yaml
, но это не встроенный модуль, и вы не указываете, какой это пакет. Запускimport yaml
на новой установке Python3 приводит кModuleNotFoundError: No module named 'yaml'
Пример:
источник
Я использую ruamel.yaml .
Подробности и дебаты здесь.Использование ruamel.yaml совместимо (с некоторыми простыми разрешимыми проблемами) со старым использованием PyYAML и, как указано в приведенной мной ссылке, используйте
вместо
и это решит большинство ваших проблем.
РЕДАКТИРОВАТЬ : PyYAML не мертв, как оказалось, он просто поддерживается в другом месте.
источник
источник