Comment analyser un fichier YAML en Python?
Comment analyser un fichier YAML en Python?
Réponses:
La méthode la plus simple et la plus pure sans compter sur les en-têtes C est PyYaml ( documentation ), qui peut être installée via 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)
Et c'est tout. Une yaml.load()
fonction simple existe également, mais yaml.safe_load()
devrait toujours être préférée, sauf si vous avez explicitement besoin de la sérialisation / désérialisation arbitraire d'objet fournie afin d'éviter d'introduire la possibilité d'exécution de code arbitraire.
Notez que le projet PyYaml prend en charge les versions jusqu'à la spécification YAML 1.1 . Si la prise en charge de la spécification YAML 1.2 est nécessaire, voir ruamel.yaml comme indiqué dans cette réponse .
pip install pyyaml
, consultez cet article pour plus d'options 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
et .yaml
Pour votre application, les éléments suivants peuvent être importants:
Voir aussi: Comparaison des formats de sérialisation des données
Dans le cas où vous cherchez plutôt un moyen de créer des fichiers de configuration, vous voudrez peut-être lire mon court article Fichiers de configuration en Python
€
sur Windows est €
. Quelqu'un connaît la raison?
io.open(doc_name, 'r', encoding='utf8')
pour lire le caractère spécial. YAML version 0.1.7
open(doc_name, ..., encodung='utf8')
pour lire et écrire, sans importer io
.
Si vous avez YAML conforme à la spécification YAML 1.2 (publiée en 2009), vous devez utiliser ruamel.yaml (avertissement: je suis l'auteur de ce package). Il s'agit essentiellement d'un sur-ensemble de PyYAML, qui prend en charge la plupart de YAML 1.1 (à partir de 2005).
Si vous voulez pouvoir conserver vos commentaires lors d'un aller-retour, vous devez certainement utiliser ruamel.yaml.
La mise à niveau de l'exemple de @ Jon est simple:
import ruamel.yaml as yaml
with open("example.yaml") as stream:
try:
print(yaml.safe_load(stream))
except yaml.YAMLError as exc:
print(exc)
À utiliser safe_load()
sauf si vous avez vraiment un contrôle total sur l'entrée, en avez besoin (rarement le cas) et savez ce que vous faites.
Si vous utilisez pathlib Path
pour manipuler des fichiers, il vaut mieux utiliser la nouvelle API ruamel.yaml fournit:
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)
). J'ai essayé de définir yaml.encoding sur utf-8 mais je n'ai pas fonctionné car la méthode de chargement dans YAML utilise toujours l'ascii_decode. Est-ce un bug?
Installez d'abord pyyaml à l'aide de pip3.
Importez ensuite le module yaml et chargez le fichier dans un dictionnaire appelé 'my_dict':
import yaml
with open('filename.yaml') as f:
my_dict = yaml.safe_load(f)
C'est tout ce dont vous avez besoin. Maintenant, le fichier yaml entier est dans le dictionnaire 'my_dict'.
!!python
), il peut également être dangereux (comme dans un disque dur complet nettoyé) à utiliser yaml.load()
. Comme cela est clairement documenté, vous devriez avoir répété cet avertissement ici (dans presque tous les cas, vous yaml.safe_load()
pouvez l'utiliser).
import yaml
, mais ce n'est pas un module intégré, et vous ne spécifiez pas de quel package il s'agit. L'exécution import yaml
d'une nouvelle installation de Python3 se traduit parModuleNotFoundError: No module named 'yaml'
Exemple:
defaults.yaml
url: https://www.google.com
environment.py
from ruamel import yaml
data = yaml.safe_load(open('defaults.yaml'))
data['url']
J'utilise ruamel.yaml . Détails et débat ici .
from ruamel import yaml
with open(filename, 'r') as fp:
read_data = yaml.load(fp)
L'utilisation de ruamel.yaml est compatible (avec quelques problèmes simples résolubles) avec les anciennes utilisations de PyYAML et comme il est indiqué dans le lien que j'ai fourni, utilisez
from ruamel import yaml
au lieu de
import yaml
et cela résoudra la plupart de vos problèmes.
EDIT : PyYAML n'est pas mort comme il se trouve, il est juste maintenu dans un endroit différent.
#!/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
car il ne peut pas exécuter de code arbitraire à partir du fichier YAML.