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 !