C15.2 : Traitement des données en python
Documentation officielle python : Lecture et écriture de fichiers CSV
Importation des données d'un fichier csv en python
Importation dans une liste de listes
Voici les étapes de l'importation
- - La première étape consiste à importer le fichier texte à l'aide de la fonction
open. Le paramètre'r'indique que le fichier est ouvert en lecture seule et le paramètreencoding='utf-8'fichier source est codé en utf-8. - - La deuxième étape consiste à transformer le texte importé en utilisant la fonction
readerde la librairiecsv. Cette fonction renvoie un objet qui n'est pas directement exploitable mais qui est un itérable dont chaque élément est un tableau à une dimension correspondant à une ligne du fichier csv. - - La troisième étape consiste donc à parcourir l'itérable élément par élément et à ajouter chacun de ces éléments dans une liste.
On obtient ainsi une lite de liste.
🠆 Exemple avec le fichier films.csv.
import csv
listeFilms = []
objFichier = open('films.csv', 'r', encoding='utf-8')
objDatasCsv = csv.reader(objFichier, delimiter=';')
for ligne in objDatasCsv:
listeFilms.append(ligne)
objFichier.close()
print(listeFilms)
🠆 Ce code peut être simplifié en utilisant with :
import csv
listeFilms = []
with open('films.csv', 'r', encoding='utf-8') as objFichier:
objDatasCsv = csv.reader(objFichier, delimiter=';')
for ligne in objDatasCsv:
listeFilms.append(ligne)
Importation dans une liste de dictionnaires
La méthode est similaire.
La première étape est inchangée.
Dans la deuxième étape, on utilise la fonction DictReader (à la place de reader). Cette fonction renvoie un objet itérable dont chaque élément est un objet apparenté à un dictionnaire correspondant à une ligne du fichier csv, les clés étant les valeurs de la première ligne du fichier.
Dans la troisième étape, il faut, en plus convertir chaque élément en dictionnaire avant de l'ajouter à la liste.
On obtient ainsi une liste de dictionnaires.
🠆 Exemple avec le fichier films.csv.
import csv
listeFilms = []
with open('films.csv', 'r', encoding='utf-8') as objFichier:
objDatasCsv = csv.DictReader(objFichier, delimiter=';')
for ligne in objDatasCsv:
listeFilms.append(dict(ligne))
Applications : Interrogation des données d'un fichier csv
Dans cette partie, on travaillera avec le fichier csv "ilevia_vlille_temps_reel" (téléchargeable au format csv ici depuis le site Le portail opendata de la Métropole Européenne de Lille (une version locale est téléchargeable ici).
On écrira l'ensemble du travail dans un seul programme.
1) Récupération des données
Écrire un fonction qui prend un nom de fichier csv en paramètre, et renvoie une liste de dictionnaires correspondant aux données du fichier.
2) Liste des noms des stations
a - Écrire une fonction qui renvoie la liste des noms des stations de V'Lille. On écrira deux versions, l'une où la liste est créée à l'aide d'une boucle, l'autre où la liste est créée en compréhension.
b - Compléter le programme principal pour afficher les noms des stations proprement (un titre puis un nom de station par ligne).
3) Stations hors-service
a - Écrire une fonction qui renvoie la liste des noms des stations qui ne sont pas 'EN SERVICE'. On écrira deux versions, l'une où la liste est créée à l'aide d'une boucle, l'autre où la liste est créée en compréhension.
b - Compléter le programme principal pour afficher les noms des stations proprement (un titre puis un nom de station par ligne).
4) Station ayant le plus grand nombre de places disponibles
a - Écrire une fonction qui renvoie le dictionnaire de la station qui contient le plus d'emplacements de V'Lille disponible.
b - Compléter le programme principal pour afficher le nom de la station proprement en une phrase.
Tri des données d'un fichier csv
Principe : utilisation complète de la fonction sort
La structure de la fonction sort est la suivante : liste.sort(key = fonc, reverse=False)
Dans cette structure, fonc est une fonction qui doit :
- - avoir un unique paramètre de même type que les éléments de la liste,
- - renvoyer un valeur qui servira de critère de tri.
Cette fonction renvoie sa données pour chaque élément de la liste et le tri se fait à partir de cet ensemble de données.
Exemple : tri d'une liste simple
Dans cet exemple, on souhaite trier une liste de chaînes de caractères sans tenir compte des majuscules
# ----- Tri sans clé -----
liste_de_chaine = ['bernard', 'jules', 'bertrand', 'arthur', 'claude']
liste_de_chaine.sort() # Le tri se fait en fonction du critère alphabétique
# et tient compte des majuscules.
# liste_de_chaine contient ['arthur', 'bernard', 'bertrand', 'claude', 'jules']
# ----- Tri avec une clé donnée par une fonction -----
def fonc_cle_de_tri(chaine):
# Fonction qui prend une chaine en paramètre et renvoie son nombre de caractères
return len(chaine)
liste_de_chaine = ['bernard', 'jules', 'bertrand', 'arthur', 'claude']
liste_de_chaine.sort(key=fonc_cle_de_tri) # Le trie se fait en fonction du nombre de caractères
# liste_de_chaine contient ['jules', 'arthur', 'claude', 'bernard', 'bertrand']
Exemple : tri d'une liste de listes
liste = [['La ligne verte', '2000', 'Frank Darabont'],
['La liste de Schindler', '1994', 'Steven Spielberg'],
['Le voyage de Chihiro', '2002', 'Hayao Miyazaki']]
def fonc_cle_de_tri(film):
return int(film[1])
liste.sort(key=fonc_cle_de_tri);
Exemple : tri d'une liste de dictionnaires
liste = [{'Titre': 'La ligne verte', 'Année': '2000', 'Réalisateur': 'Frank Darabont'},
{'Titre': 'La liste de Schindler', 'Année': '1994', 'Réalisateur': 'Steven Spielberg'},
{'Titre': 'Le voyage de Chihiro', 'Année': '2002', 'Réalisateur': 'Hayao Miyazaki'}]
def fonc_cle_de_tri(film):
return int(film["Année"])
liste.sort(key=fonc_cle_de_tri);
Application
Dans cette partie, on travaillera avec le fichier csv "ilevia_vlille_temps_reel" (téléchargeable au format csv ici depuis le site Le portail opendata de la Métropole Européenne de Lille (une version locale est téléchargeable ici).
On écrira l'ensemble du travail dans un seul programme.
1 - Écrire une fonction creerListeCsv(url:str)->list qui prend un nom de fichier csv en paramètre et renvoie une liste de dictionnaires correspondant aux données du fichier.
2 - Écrire une fonction affiche_station(station:dict) qui prend un dictionnaire correspondant à une station en paramètre et affiche le nom et le nombre de places disponibles de cette station sur une ligne.
3 - Écrire une fonction triVelosDisponibles(listeStations:list) qui tri la liste de stations passée en paramètre par ordre décroissant du nombre de places disponibles de ces stations.
Remarque : cette fonction nécessitera l'écriture d'une autre fonction qui servira de clé de tri.
4 - Écrire le programme principal de façon à afficher les stations (nom et nombre de places) par ordre décroissant du nombre de places disponibles.
Pour aller plus loin : écrire dans un fichier csv
Méthode lorsque les différents enregistrements sont des listes
Voici les étapes de l'écriture dans un fichier :
• La première étape consiste à importer le fichier texte à l'aide de la fonction open.
- - le paramètre
'w'(pour remplacer) ou'a'(pour ajouter) indique que le fichier est ouvert en écriture ; - - le paramètre
newline=''permet d'éviter les erreurs de caractères pour les changements de lignes ; - - le paramètre
encoding='utf-8'permet d'indiquer que le fichier doit être codé en utf-8. - Remarque : si le fichier n'existe pas, il est créé.
• La deuxième étape consiste, à l'aide de la fonction writer de la librairie csv, à créer un objet spécifique dont le rôle est de convertir les données de l'utilisateur en chaine de caractères adéquat.
• La troisième étape consiste à ajouter les différents enregistrements à l'aide de la fonction writerow de la librairie csv.
Exemple : création d'une liste d'enregistrements dont les attributs sont : Nom, Prénom et Age.
import csv
with open('fichier.csv', 'w', newline='', encoding='utf-8') as objFichierCsv:
objTranscripteur = csv.writer(objFichierCsv, delimiter=';')
objTranscripteur.writerow(['Non','Prenom','Age'])
objTranscripteur.writerow(['Durand','Bernard','35'])
objTranscripteur.writerow(['Dupont','Anne','42'])
Méthode lorsque les différents enregistrements sont des dictionnaires
Exemple : création d'une liste d'enregistrements dont les attributs sont : Nom, Prénom et Age.
import csv
with open('fichier.csv', 'w', newline='', encoding='utf-8') as objFichierCsv:
liste_entetes = ['Nom','Prénom','Age']
objTranscripteur = csv.DictWriter(objFichierCsv, fieldnames=liste_entetes, delimiter=';')
objTranscripteur.writeheader()
objTranscripteur.writerow({'Nom': 'Durand', 'Prénom': 'Bernard', 'Age': '35'})
objTranscripteur.writerow({'Nom': 'Dupont', 'Prénom': 'Anne', 'Age': '42'})