Comment puis-je analyser un fichier YAML en Python
7 réponses
la méthode la plus facile et la plus puriste sans s'appuyer sur les en-têtes C est PyYaml:
#!/usr/bin/env python
import yaml
with open("example.yaml", 'r') as stream:
try:
print(yaml.load(stream))
except yaml.YAMLError as exc:
print(exc)
Et c'est tout. Plus d'informations ici:
lire et écrire des fichiers YAML avec Python 2+3 (et unicode)
# -*- 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.load(stream)
print(data == data_loaded)
fichier YAML créé
a list:
- 1
- 42
- 3.141
- 1337
- help
- €
a string: bla
another dict:
foo: bar
key: value
the answer: 42
fin du fichier commun
.yml
et .yaml
Alternatives
- CSV: super simple format ( read & write )
- JSON: Nice pour l'écriture lisible des données; TRÈS couramment utilisés ( lecture et écriture )
- YAML: YAML est un sur-ensemble de JSON, mais plus facile à lire ( lecture et écriture , comparaison de JSON et YAML )
- pickle: Un Python format de sérialisation ( lecture et écriture )
- MessagePack ( paquet Python ): représentation Plus compacte ( lire & Ecrire )
- HDF5 ( paquet Python ): Sympa pour les matrices ( lecture et écriture )
- XML: il existe aussi *soupir* ( lire & écrire )
pour votre application, les éléments suivants peuvent être importants:
- prise en charge par d'autres langages de programmation
- Lecture / écriture de la performance
- compacité (Taille du fichier)
Voir aussi: comparaison des formats de sérialisation des données
dans le cas où vous êtes plutôt à la recherche d'un moyen de créer des fichiers de configuration, vous pourriez vouloir lire mon court article fichiers de Configuration en Python
si vous avez YAML qui est conforme à la YAML 1.2 spécification (publié en 2009), alors vous devez utiliser ruamel.yaml (disclaimer: je suis l'auteur de ce forfait). Il s'agit essentiellement d'un super-ensemble de PyYAML, qui supporte la plus grande partie de YAML 1.1 (à partir de 2005).
si vous voulez être en mesure de préserver vos commentaires lors de voyage aller-retour, vous devez certainement utiliser ruamel.yaml.
améliorer L'exemple de @Jon est facile:
import ruamel.yaml as yaml
with open("example.yaml") as stream:
try:
print(yaml.safe_load(stream))
except yaml.YAMLError as exc:
print(exc)
utilisez safe_load()
sauf si vous avez le 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, vous êtes mieux d'utiliser la nouvelle API ruamel.yaml dispose:
from ruamel.yaml import YAML
from pathlib import Path
path = Path('example.yaml')
yaml = YAML(typ='safe')
data = yaml.load(path)
importer le module yaml et charger le fichier dans un dictionnaire appelé 'my_dict':
import yaml
my_dict = yaml.load(open('filename'))
C'est tout ce dont tu as besoin. Maintenant, tout le fichier yaml est dans le dictionnaire my_dict.
exemple:
par défaut.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 & débat ici .
from ruamel import yaml
with open(filename, 'r') as fp:
read_data = yaml.load(fp)
Usage 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 i fourni, utiliser
from ruamel import yaml
au lieu de
import yaml
et il corrigera la plupart de vos problèmes.
MODIFIER : PyYAML n'est pas mort comme il s'avère, c'est juste maintenu dans un autre endroit.
#!/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:]))