Comment Parser du YAML facilement en Python ?

Comment Parser du YAML facilement en Python ?

Effectuer du "parsing" (parcourir un fichier en entrée et en analyser son contenu) d'un fichier YAML en Python peut s'avérer intéressant lorsque l'on a des données qui sont entrées par un utilisateur manuellement et que l'on souhaite les extraire ou bien même lorsque ce fichier YAML est utilisé par un autre logiciel (comme Ansible, Docker-Compose, Kubernetes etc...) et que l'on souhaite les exploiter d'une quelconque manière.

Prérequis

Le module Pyyaml est requis, pour l'installer, il suffit d'exécuter la commande suivante :

pip install pyyaml

Parsons ensemble citoyen !

Prenons le cas où nous avons un fichier cars.yml avec le contenu suivant :

---
cars:
  categories:
    - compact:
        brand: "Audi"
        model: "A1"
        year: [2018,2022]
    - suv:
        brand: "Land Rover"
        model: "SVR"
        year: [2017,2021]        

J'ai volontairement pris le cas d'un fichier YAML avec différentes listes de différentes syntaxes.

Maintenant que nous avons notre fichier YAML contenant les données que nous souhaitons extraire, créons un fichier qui se nomme parse.py en important le module yaml et en chargeant le fichier YAML à l'aide la fonction yaml.load():

#!/usr/bin/env python3
import yaml

with open("cars.yml") as file:
    data = yaml.load(file, Loader=yaml.FullLoader)
print(data)
Retour :
{'cars': {'categories': [{'compact': {'brand': 'Audi', 'model': 'A1', 'year': [2018, 2022]}}, {'suv': {'brand': 'Land Rover', 'model': 'SVR', 'year': [2017, 2021]}}]}}

On peut voir que la sortie est au format JSON et non en YAML car le YAML est un superset du language JSON.

Prenons le cas où je veux récupérer uniquement chacun des modèles de voiture. Pour ce faire, nous allons déclarer une liste et parcourir le fichier YAML avec deux boucles for imbriquées. Ce qui nous donne :

#!/usr/bin/env python3
import yaml

with open("cars.yml") as file:
    data = yaml.load(file, Loader=yaml.FullLoader)

cars = []
for category in data["cars"]["categories"]:
    for car_type, car_data in category.items():
        cars.append(car_data["model"])

print(cars)
Retour :
['A1', 'SVR']

Convertissons-nous

Maintenant que nous savons cibler les informations que nous souhaitons récupérer dans un fichier YAML, nous allons voir le cas où nous avons déjà nos données sous forme de dictionnaire Python et que nous souhaitons créer un fichier YAML à partir de ce dictionnaire !

Changeons d'exemple et partons sur des viles cette fois-ci, modifions notre fichier parse.py :

#!/usr/bin/env python3
import yaml

cities = {
    "Kaduna": {
        "Country": "Nigeria",
        "Population": "6,113,503",
        "Famous for": "Historical and cultural heritage"
    },
    "Sarajevo": {
        "Country": "Bosnia and Herzegovina",
        "Population": "275,524",
        "Famous for": "1984 Winter Olympics, multicultural heritage"
    },
    "Gwangju": {
        "Country": "South Korea",
        "Population": "1,539,919",
        "Famous for": "Democracy Movement, Art Biennale"
    }
}

Afin de générer un fichier YAML à partir de ce dictionnaire, il est nécessaire d'utiliser la fonction yaml.dump() . Ajoutez ceci à la fin de votre script Python :

with open("cities.yaml", 'w') as outfile:
    yaml.dump(cities, outfile)

Un fichier cities.yaml vient d'être crée et voici son contenu :

Gwangju:
  Country: South Korea
  Famous for: Democracy Movement, Art Biennale
  Population: 1,539,919
Kaduna:
  Country: Nigeria
  Famous for: Historical and cultural heritage
  Population: 6,113,503
Sarajevo:
  Country: Bosnia and Herzegovina
  Famous for: 1984 Winter Olympics, multicultural heritage
  Population: 275,524

Vous savez maintenant comment parser un fichier YAML ainsi que de convertir des dictionnaires Python en un fichier YAML !