Як я можу розібрати YAML-файл у Python?
Як я можу розібрати YAML-файл у Python?
Відповіді:
Найпростіший і найчистіший метод, не покладаючись на заголовки 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, як зазначено у цій відповіді .
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.
Оновити приклад Джона легко:
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_de. Це помилка?
Спочатку встановіть 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
і це виправить більшість ваших проблем.
EDIT : 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.