Utilisation du module YAML en Python

Introduction aux fichiers YAML

YAML est un format de sérialisation des données couramment utilisé pour les fichiers de configuration.

1. Règles syntaxiques de YAML

  • L'analyse est sensible à la casse
  • La hiérarchie est définie par l'indentation
  • L'indentation utilise exclusivement des espaces (pas de tabulations)
  • Le nombre d'espaces d'indentation peut varier tant que les éléments de même niveau sont alignés
  • Les chaînes simples n'ont pas besoin de guillemets, sauf si elles contiennent des caractères spéciaux
  • Les commentaires débutent par le symbole #

2. Structures de données YAML

Mappages : Collections de paires clé-valeur (équivalent des dictionnaires Python). La clé et la valeur sont séparées par deux-points avec un espace.

Séquences : Listes ordonnées d'éléments. Chaque élément est précédé du tiret "-" avec un espace.

Scalars : Valeurs atomiques (chaînes, booléens, nombres entiers/flottants, dates, null). La valeur nulle s'écrit null ou ~.

Lecture de fichiers YAML avec Python

1. Configuration requise

Pour manipuler des fichiers YAML en Python, vous devez installer le paquet PyYAML et imporetr le module yaml :

  • Installation : pip3 install pyyaml
  • Importation : import yaml

2. Extraction des données YAML

Python ouvre le fichier avec open(), puis convertit le contenu texte en structures Python natives via yaml.safe_load() :


import yaml
import pathlib

def lire_fichier_yaml(chemin_fichier):
    """Charge et parse un fichier YAML"""
    print("--- Lecture du fichier ---")
    with open(chemin_fichier, 'r', encoding='utf-8') as fichier:
        contenu_brut = fichier.read()
    print(contenu_brut)
    
    print("--- Conversion en structure Python ---")
    donnees = yaml.safe_load(contenu_brut)
    print(type(donnees))
    return donnees

# Utilisation
chemin = pathlib.Path.cwd() / "config.yaml"
resultat = lire_fichier_yaml(chemin)

3. Exemples de structures YAML parsées

Mappages simples


# Contenu YAML (config_simple.yaml)
utilisateur: admin
motdepasse: secret123
description: "Paramètres\nprincipaux"

Résultat Python : {'utilisateur': 'admin', 'motdepasse': 'secret123', 'description': 'Paramètres\nprincipaux'}

Mappages imbriqués


# Contenu YAML (config_imbriquee.yaml)
compte1:
  nom: service_a
  cle_api: "ABC-123"
compte2:
  nom: service_b
  cle_api: "XYZ-789"

Résultat Python : {'compte1': {'nom': 'service_a', 'cle_api': 'ABC-123'}, 'compte2': {'nom': 'service_b', 'cle_api': 'XYZ-789'}}

Séquences dans des mappages


# Contenu YAML (config_listes.yaml)
serveurs:
  - web-01.example.com
  - web-02.example.com
  - db-01.example.com
ports:
  - 8080
  - 8443

Résultat Python : {'serveurs': ['web-01.example.com', 'web-02.example.com', 'db-01.example.com'], 'ports': [8080, 8443]}

Séquences contenant des mappages


# Contenu YAML (config_sequence_mappages.yaml)
- environnement: production
  actif: true
- environnement: developpement
  actif: false
  debug: true

Résultat Python : [{'environnement': 'production', 'actif': True}, {'environnement': 'developpement', 'actif': False, 'debug': True}]

4. Gestion des scalaires spéciaux


# Exemples de valeurs scalaires
texte_simple: bonjour
nombre_entier: 42
nombre_decimal: 3.14159
booleen_vrai: oui
booleen_faux: non
valeur_nulle: null
date_iso: 2023-12-31
heure_iso: 2023-12-31T23:59:59Z

Python interprétera ces valeurs avec les types appropriés : str, int, float, bool, None, datetime.date, datetime.datetime.

5. Références et ancres


# Contenu YAML avec ancres
defaults: &config_defaut
  timeout: 30
  retries: 3

service_principal:
  <<: *config_defaut
  endpoint: "https://api.principal.example"

Le résultat Python aura les valeurs de timeout et retries copiées dans la section service_principal.

Traitement de plusieurs documents YAML

1. Structure multi-doucments

Plusieurs documents YAML dans un même fichier sont séparés par --- :


---
type: configuration
version: 2
---
type: donnees
contenu: [a, b, c]

2. Chargement de tous les documents

Utilisez yaml.safe_load_all() pour parcourir chaque document :


def lire_tous_documents(chemin_fichier):
    with open(chemin_fichier, 'r', encoding='utf-8') as f:
        documents = yaml.safe_load_all(f.read())
        for index, doc in enumerate(documents):
            print(f"Document {index}: {doc}")

chemin = pathlib.Path.cwd() / "multi_doc.yaml"
lire_tous_documents(chemin)

Génération de fichiers YAML

1. Avec PyYAML

La fonction yaml.dump() sérialise les objets Python :


def creer_fichier_yaml(chemin_sortie, donnees):
    with open(chemin_sortie, 'w', encoding='utf-8') as f:
        yaml.dump(donnees, f, default_flow_style=False, allow_unicode=True)

config = {
    'base_donnees': {
        'host': 'localhost',
        'port': 5432,
        'utilisateurs': ['admin', 'app']
    }
}

creer_fichier_yaml('nouvelle_config.yaml', config)

2. Avec ruamel.yaml pour un formatage avancé

Le module ruamel.yaml permet un meilleur contrôle du formatage et préserve l'ordre des clés :


from ruamel.yaml import YAML

def generer_yaml_ruamel(chemin, donnees):
    yml = YAML()
    yml.default_flow_style = False
    with open(chemin, 'w', encoding='utf-8') as f:
        yml.dump(donnees, f)

donnees_complexes = [
    {'nom': 'alpha', 'tags': ['important', 'urgent']},
    {'nom': 'beta', 'tags': ['test']}
]

generer_yaml_ruamel('config_ruamel.yaml', donnees_complexes)

3. Lecture avec ruamel.yaml


def lire_yaml_ruamel(chemin):
    yml = YAML()
    with open(chemin, 'r', encoding='utf-8') as f:
        return yml.load(f)

contenu = lire_yaml_ruamel('config_ruamel.yaml')

Étiquettes: YAML Python PyYAML ruamel.yaml Configuration

Publié le 13 juillet à 07h18