1. À propos du tri des données d'un fichier CSV en Python
Le module csv de Python permet de lire et d'écrire des fichiers CSV. Pour trier les données, on peut lire les lignes du fichier, les placer dans une liste, puis utiliser la fonction sorted() ou la méthode sort().
Dans ce tutoriel, nous utiliserons le fichier etudiants.csv suivant. Il contient un identifiant, un nom, un âge, une ville et une note pour chaque étudiant.
1 2 3 4 5 6 | id,nom,age,ville,note 1,Amine,21,Oujda,15.5 2,Sara,20,Rabat,17 3,Yassine,22,Fès,13.5 4,Lina,19,Casablanca,18 5,Omar,21,Agadir,14 |
Sortie :
1 2 3 4 5 6 | id,nom,age,ville,note 1,Amine,21,Oujda,15.5 2,Sara,20,Rabat,17 3,Yassine,22,Fès,13.5 4,Lina,19,Casablanca,18 5,Omar,21,Agadir,14 |
Avant d'effectuer un tri, on peut lire le fichier avec csv.DictReader(). Chaque ligne devient alors un dictionnaire dont les clés correspondent aux noms des colonnes.
1 2 3 4 5 | import csv with open("etudiants.csv", "r", newline="", encoding="utf-8") as fichier: lecteur = csv.DictReader(fichier) for ligne in lecteur: print(ligne["nom"], ligne["age"], ligne["note"]) |
Sortie :
1 2 3 4 5 | Amine 21 15.5 Sara 20 17 Yassine 22 13.5 Lina 19 18 Omar 21 14 |
Il faut remarquer que les valeurs obtenues avec csv.DictReader() sont des chaînes de caractères. Cette particularité est importante lorsqu'on souhaite trier correctement des valeurs numériques.
2. Trier les données selon une colonne de texte
Pour trier les lignes selon une colonne contenant du texte, on peut utiliser sorted() avec le paramètre key. Une fonction lambda permet d'indiquer la colonne utilisée comme clé de tri.
Le programme suivant trie les étudiants selon leur nom dans l'ordre alphabétique.
1 2 3 4 5 6 7 | import csv with open("etudiants.csv", "r", newline="", encoding="utf-8") as fichier: lecteur = csv.DictReader(fichier) lignes = list(lecteur) lignes_triees = sorted(lignes, key=lambda ligne: ligne["nom"]) for ligne in lignes_triees: print(ligne["nom"]) |
Sortie :
1 2 3 4 5 | Amine Lina Omar Sara Yassine |
Le même principe permet de trier les données selon la ville. La valeur de la colonne "ville" devient alors la clé utilisée par sorted().
1 2 3 4 5 6 7 | import csv with open("etudiants.csv", "r", newline="", encoding="utf-8") as fichier: lecteur = csv.DictReader(fichier) lignes = list(lecteur) lignes_triees = sorted(lignes, key=lambda ligne: ligne["ville"]) for ligne in lignes_triees: print(ligne["ville"], "-", ligne["nom"]) |
Sortie :
1 2 3 4 5 | Agadir - Omar Casablanca - Lina Fès - Yassine Oujda - Amine Rabat - Sara |
Pour effectuer un tri alphabétique sans tenir compte des différences entre majuscules et minuscules, on peut appliquer casefold() à la valeur utilisée comme clé.
1 2 3 | noms = ["yassine", "Amine", "sara", "Lina"] noms_tries = sorted(noms, key=lambda nom: nom.casefold()) print(noms_tries) |
Sortie :
1 | ['Amine', 'Lina', 'sara', 'yassine'] |
3. Trier les données selon une colonne numérique
Avec csv.DictReader(), les valeurs lues sont des chaînes de caractères. Pour trier correctement une colonne numérique, il faut donc convertir sa valeur avec int() ou float() selon le type de données.
Trier selon un entier
La colonne "age" contient des nombres entiers. On utilise donc int() dans la clé de tri afin de comparer les âges comme des nombres et non comme des chaînes.
1 2 3 4 5 6 7 | import csv with open("etudiants.csv", "r", newline="", encoding="utf-8") as fichier: lecteur = csv.DictReader(fichier) lignes = list(lecteur) lignes_triees = sorted(lignes, key=lambda ligne: int(ligne["age"])) for ligne in lignes_triees: print(ligne["nom"], "-", ligne["age"]) |
Sortie :
1 2 3 4 5 | Lina - 19 Sara - 20 Amine - 21 Omar - 21 Yassine - 22 |
Trier selon un nombre décimal
La colonne "note" peut contenir des nombres décimaux. On utilise donc float() afin d'effectuer un véritable tri numérique.
1 2 3 4 5 6 7 | import csv with open("etudiants.csv", "r", newline="", encoding="utf-8") as fichier: lecteur = csv.DictReader(fichier) lignes = list(lecteur) lignes_triees = sorted(lignes, key=lambda ligne: float(ligne["note"])) for ligne in lignes_triees: print(ligne["nom"], "-", ligne["note"]) |
Sortie :
1 2 3 4 5 | Yassine - 13.5 Omar - 14 Amine - 15.5 Sara - 17 Lina - 18 |
Pourquoi convertir les valeurs numériques ?
Sans conversion, Python effectue un tri lexicographique des chaînes. Par exemple, la chaîne "100" est placée avant "20" car le premier caractère "1" est inférieur à "2".
1 2 3 | valeurs = ["5", "20", "100", "9"] print(sorted(valeurs)) print(sorted(valeurs, key=int)) |
Sortie :
1 2 | ['100', '20', '5', '9'] ['5', '9', '20', '100'] |
4. Effectuer un tri décroissant et un tri sur plusieurs colonnes
Trier dans l'ordre décroissant
Par défaut, sorted() effectue un tri croissant. Pour obtenir un tri décroissant, il suffit d'utiliser le paramètre reverse=True. L'exemple suivant classe les étudiants de la meilleure note à la plus faible.
1 2 3 4 5 6 7 8 9 10 11 | import csv with open("etudiants.csv", "r", newline="", encoding="utf-8") as fichier: lecteur = csv.DictReader(fichier) lignes = list(lecteur) lignes_triees = sorted( lignes, key=lambda ligne: float(ligne["note"]), reverse=True ) for ligne in lignes_triees: print(ligne["nom"], "-", ligne["note"]) |
Sortie :
1 2 3 4 5 | Lina - 18 Sara - 17 Amine - 15.5 Omar - 14 Yassine - 13.5 |
Trier sur plusieurs colonnes
Pour trier selon plusieurs critères, la fonction utilisée comme clé peut retourner un tuple. Le programme suivant trie d'abord les étudiants selon leur âge, puis selon leur nom lorsque plusieurs étudiants ont le même âge.
1 2 3 4 5 6 7 8 9 10 | import csv with open("etudiants.csv", "r", newline="", encoding="utf-8") as fichier: lecteur = csv.DictReader(fichier) lignes = list(lecteur) lignes_triees = sorted( lignes, key=lambda ligne: (int(ligne["age"]), ligne["nom"]) ) for ligne in lignes_triees: print(ligne["age"], "-", ligne["nom"]) |
Sortie :
1 2 3 4 5 | 19 - Lina 20 - Sara 21 - Amine 21 - Omar 22 - Yassine |
Différence entre sorted() et sort()
La fonction sorted() crée une nouvelle liste triée sans modifier la liste d'origine. La méthode list.sort(), quant à elle, trie directement la liste existante et retourne None.
1 2 3 4 5 6 7 | nombres = [15, 7, 20, 3] nombres_tries = sorted(nombres) print("Original :", nombres) print("Trié :", nombres_tries) resultat = nombres.sort() print("Après sort() :", nombres) print("Retour de sort() :", resultat) |
Sortie :
1 2 3 4 | Original : [15, 7, 20, 3] Trié : [3, 7, 15, 20] Après sort() : [3, 7, 15, 20] Retour de sort() : None |
5. Enregistrer les données triées dans un fichier CSV
Trier les lignes en mémoire ne modifie pas automatiquement le fichier CSV. Pour conserver le nouvel ordre, il faut écrire les données triées dans un fichier avec csv.DictWriter().
Créer un nouveau fichier CSV trié
Le programme suivant lit etudiants.csv, trie les étudiants par note décroissante et enregistre le résultat dans un nouveau fichier nommé etudiants_tries.csv.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | import csv with open("etudiants.csv", "r", newline="", encoding="utf-8") as fichier: lecteur = csv.DictReader(fichier) colonnes = lecteur.fieldnames lignes = list(lecteur) lignes_triees = sorted( lignes, key=lambda ligne: float(ligne["note"]), reverse=True ) with open("etudiants_tries.csv", "w", newline="", encoding="utf-8") as fichier: ecrivain = csv.DictWriter(fichier, fieldnames=colonnes) ecrivain.writeheader() ecrivain.writerows(lignes_triees) print("Le fichier etudiants_tries.csv a été créé.") |
Sortie :
1 | Le fichier etudiants_tries.csv a été créé. |
Le nouveau fichier contient maintenant les étudiants classés de la note la plus élevée à la note la plus faible.
1 2 3 4 5 6 | id,nom,age,ville,note 4,Lina,19,Casablanca,18 2,Sara,20,Rabat,17 1,Amine,21,Oujda,15.5 5,Omar,21,Agadir,14 3,Yassine,22,Fès,13.5 |
Sortie :
1 2 3 4 5 6 | id,nom,age,ville,note 4,Lina,19,Casablanca,18 2,Sara,20,Rabat,17 1,Amine,21,Oujda,15.5 5,Omar,21,Agadir,14 3,Yassine,22,Fès,13.5 |
Remplacer le fichier original par sa version triée
Si l'on souhaite modifier directement l'ordre des données du fichier original, on peut lire toutes les lignes, fermer le fichier, effectuer le tri, puis rouvrir le même fichier en mode écriture. Il est important d'avoir terminé la lecture avant de réécrire le fichier.
1 2 3 4 5 6 7 8 9 10 11 12 | import csv nom_fichier = "etudiants.csv" with open(nom_fichier, "r", newline="", encoding="utf-8") as fichier: lecteur = csv.DictReader(fichier) colonnes = lecteur.fieldnames lignes = list(lecteur) lignes.sort(key=lambda ligne: ligne["nom"].casefold()) with open(nom_fichier, "w", newline="", encoding="utf-8") as fichier: ecrivain = csv.DictWriter(fichier, fieldnames=colonnes) ecrivain.writeheader() ecrivain.writerows(lignes) print("Le fichier a été trié par nom.") |
Sortie :
1 | Le fichier a été trié par nom. |
Après cette opération, le fichier original contient les étudiants dans l'ordre alphabétique de leur nom.
1 2 3 4 5 6 | id,nom,age,ville,note 1,Amine,21,Oujda,15.5 4,Lina,19,Casablanca,18 5,Omar,21,Agadir,14 2,Sara,20,Rabat,17 3,Yassine,22,Fès,13.5 |
Sortie :
1 2 3 4 5 6 | id,nom,age,ville,note 1,Amine,21,Oujda,15.5 4,Lina,19,Casablanca,18 5,Omar,21,Agadir,14 2,Sara,20,Rabat,17 3,Yassine,22,Fès,13.5 |
6. À retenir !
Pour trier les données d'un fichier CSV en Python, on lit généralement les lignes du fichier, on les trie avec sorted() ou sort(), puis on les réécrit si l'on souhaite enregistrer le résultat.
- csv.DictReader() facilite le tri en permettant d'accéder aux données par le nom des colonnes.
- sorted() retourne une nouvelle liste triée.
- list.sort() modifie directement la liste existante et retourne None.
- Le paramètre key permet de préciser la colonne utilisée pour le tri.
- Une fonction lambda est pratique pour construire la clé de tri.
- Pour une colonne numérique, il faut généralement convertir les valeurs avec int() ou float().
- Le paramètre reverse=True permet d'obtenir un tri décroissant.
- Une clé sous forme de tuple permet d'effectuer un tri selon plusieurs critères.
- csv.DictWriter() permet d'enregistrer les lignes triées dans un fichier CSV.
- Le tri réalisé en mémoire ne modifie le fichier original que si les données sont ensuite réécrites dans ce fichier.
Le programme suivant résume les principales étapes permettant de lire un fichier CSV, de trier ses données selon une colonne numérique et d'enregistrer le résultat dans un nouveau fichier.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | import csv with open("etudiants.csv", "r", newline="", encoding="utf-8") as fichier: lecteur = csv.DictReader(fichier) colonnes = lecteur.fieldnames lignes = list(lecteur) lignes_triees = sorted( lignes, key=lambda ligne: float(ligne["note"]), reverse=True ) with open("etudiants_tries.csv", "w", newline="", encoding="utf-8") as fichier: ecrivain = csv.DictWriter(fichier, fieldnames=colonnes) ecrivain.writeheader() ecrivain.writerows(lignes_triees) print("Tri terminé avec succès.") |
Sortie :
1 | Tri terminé avec succès. |
Auteur : Younes Derfoufi
Lieu de travail : CRMEF OUJDA
Site Web : www.tresfacile.net
Chaine YouTube : https://www.youtube.com/user/InformatiquesFacile
Me contacter : https://www.tresfacile.net/me-contacter/



