Comment analyser un fichier YAML en Python?
611
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 .
yaml.safe_load
car il ne peut pas exécuter de code arbitraire à partir du fichier YAML.pip install pyyaml
, consultez cet article pour plus d'options stackoverflow.com/questions/14261614/…Lire et écrire des fichiers YAML avec Python 2 + 3 (et unicode)
Fichier YAML créé
Terminaisons de fichiers communes
.yml
et.yaml
Alternatives
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
la source
€
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.7open(doc_name, ..., encodung='utf8')
pour lire et écrire, sans importerio
.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:
À 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:la source
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':
C'est tout ce dont vous avez besoin. Maintenant, le fichier yaml entier est dans le dictionnaire 'my_dict'.
la source
!!python
), il peut également être dangereux (comme dans un disque dur complet nettoyé) à utiliseryaml.load()
. Comme cela est clairement documenté, vous devriez avoir répété cet avertissement ici (dans presque tous les cas, vousyaml.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écutionimport yaml
d'une nouvelle installation de Python3 se traduit parModuleNotFoundError: No module named 'yaml'
Exemple:
la source
J'utilise ruamel.yaml .
Détails et débat ici.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
au lieu de
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.
la source
la source