1090 votes

Comment analyser un fichier YAML en Python ?

Comment analyser un fichier YAML en Python ?

1424voto

Jon Points 23749

La méthode la plus simple et la plus pure sans s'appuyer sur les en-têtes C est PyYaml ( documentation ), qui peut être installé via 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)

Et c'est tout. Une plaine yaml.load() 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 d'objets arbitraires fournie afin d'éviter d'introduire la possibilité d'une exécution de code arbitraire.

Notez que le projet PyYaml supporte les versions jusqu'à la version Spécification YAML 1.1 . Si Spécification YAML 1.2 un soutien est nécessaire, voir ruamel.yaml comme indiqué dans cette réponse .

166 votes

J'ajouterais qu'à moins que vous ne souhaitiez sérialiser/désérialiser des objets arbitraires, il est préférable d'utiliser yaml.safe_load car il ne peut pas exécuter de code arbitraire à partir du fichier YAML.

4 votes

Yaml yaml = new Yaml() ; Object obj = yaml.load("a : 1 \nb : 2 \nc : \n - aaa \n - bbb") ;

3 votes

229voto

moose Points 4945

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.safe_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

Terminaisons communes de fichiers

.yml et .yaml

Alternatives

Pour votre application, les éléments suivants peuvent être importants :

  • Prise en charge par d'autres langages de programmation
  • Performance en lecture/écriture
  • Compacité (taille du fichier)

Voir aussi : Comparaison des formats de sérialisation des données

Si vous êtes plutôt à la recherche d'un moyen de créer des fichiers de configuration, vous pouvez lire mon court article. Fichiers de configuration en Python

86voto

Anthon Points 4119

Si vous disposez de YAML conforme à la norme Spécification YAML 1.2 (version 2009), vous devez utiliser ruamel.yaml (disclaimer : je suis l'auteur de ce paquet). C'est essentiellement un sur-ensemble de PyYAML, qui supporte la plupart de YAML 1.1 (de 2005).

Si vous voulez être en mesure de préserver vos commentaires lors des allers-retours, vous devriez certainement utiliser ruamel.yaml.

La mise à jour de 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 vraiment le contrôle total de l'entrée, que vous en avez besoin (ce qui est rarement le cas) et que vous savez ce que vous faites.

Si vous utilisez pathlib Path pour manipuler les fichiers, il est préférable d'utiliser la nouvelle API ruamel.yaml :

from ruamel.yaml import YAML
from pathlib import Path

path = Path('example.yaml')
yaml = YAML(typ='safe')
data = yaml.load(path)

61voto

Pal Points 712

Installez d'abord pyyaml en utilisant 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'.

16voto

rinkush sharda Points 71

Pour accéder à n'importe quel élément d'une liste dans un fichier YAML comme ceci :

global:
  registry:
    url: dtr-:5000/
    repoPath:
  dbConnectionString: jdbc:oracle:thin:@x.x.x.x:1521:abcd

Vous pouvez utiliser le python script suivant :

import yaml

with open("/some/path/to/yaml.file", 'r') as f:
    valuesYaml = yaml.load(f, Loader=yaml.FullLoader)

print(valuesYaml['global']['dbConnectionString'])

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X