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

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 :

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.

• 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'})