En cours d'élaboration !

Aujourd'hui des quantités énormes de données sont produites chaque jour. L'informatique en permet le traitement .

Même si il existe des logiciels spécialisés, les logiciels de gestion de bases de données (SGDB) que nous étudierons en terminale, le langage de programmation python nous permet de lire, d'écrire, ou de traiter des données structurées notamment au format CSV.

Demandez le programme !

Le format csv

Définition du format csv

Le format CSV (pour comma separated values, soit en français valeurs séparées par des virgules) est un format très utilisé pour représenter des données structurées, notamment pour importer ou exporter des données à partir d'une feuille de calculs d'un tableur. C'est un fichier texte dans lequel chaque ligne correspond à une ligne du tableau

Exemple de feuille de calculs

Fichier csv correspondant

Dans ce format, chaque ligne représente un enregistrement c'est à dire une structure de données, de types éventuellement différents auxquels on accède grâce à un nom et, sur une même ligne, les différents champs de l’enregistrement sont séparés par une virgule (d’où le nom).

En python en enregistrement peut-être représenté par un dictionnaire :

{'Nom':'Baron', 'Prénom':'Paul', 'NSI':'18', 'Physique':'16', 'Maths':'15'}

Et un fichier csv par une liste de dictionnaires, dont les clés sont les noms des colonnes :

ma_table = [{'Nom':'Baron', 'Prénom':'Paul', 'NSI':'18', 'Physique':'16', 'Maths':'15'},
		    {'Nom':'Taillant', 'Prénom':'Greg', 'NSI':'1', 'Physique':'3', 'Maths':'5'},
		    {'Nom':'Gourdy', 'Prénom':'Zoé', 'NSI':'14', 'Physique':'13', 'Maths':'16'}]

Import d'un fichier csv : les fonctions reader et Dictreader

L'objectif de cette partie est d'apprendre à importer un fichier csv en Python. C'est à dire à lire un fichier csv en vue de le manipuler.

Import d'un fichier csv

La bibliothèque csv implémente des classes pour lire des données tabulaires au format CSV

La fonction reader() du module csv renvoie un objet de type csv.reader qui est itérable. Chaque élément de cet objet est une liste.

La fonction DictReader du module csv renvoie un objet de type csv.DictReader itérable aussi. Chaque élément de cet objet est un dictionnaire ordonné : c'est un dictionnaire qui mémorise l'ordre d'insertion des clés. Les éléments de la première ligne du fichier csv (appelés noms de champ ou descripteur) se retrouvent être les clés de ce dictionnaire.

fichier csv à télécharger

Utilisation de la fonction Reader.


import csv # le module pour les fichiers csv
file = open("test.csv" , "r") # ouvrir le fichier
csv_en_liste = csv.reader(file , delimiter = ",") # initialisation d’un lecteur de fichier delimiter est facultatif
for ligne in csv_en_liste : # parcours du lecteur avec une boucle
    print(ligne) # affichage ligne à ligne
file.close () # fermeture du fichier
			

Utilisation de la fonction DictReader


import csv # le module pour les fichiers csv
file = open("test.csv" , "r") # ouvrir le fichier
csv_en_dico = csv.DictReader(file , delimiter = ",") # initialisation d’un lecteur de fichier avec création automatique de dictionnaire
for ligne in csv_en_dico : # parcours du lecteur avec une boucle
	print(dict(ligne)) # affichage ligne à ligne
file.close () # fermeture du fichier
							

Utilisation de la fonction DictReader et obtention de dictionnaires.


import csv # le module pour les fichiers csv
file = open("test.csv" , "r") # ouvrir le fichier
csv_en_dico = csv.DictReader(file , delimiter = ",") # initialisation d’un lecteur de fichier avec création automatique de dictionnaire
for ligne in csv_en_dico : # parcours du lecteur avec une boucle
    print(dict(ligne)) # affichage ligne à ligne
file.close () # fermeture du fichier
			

Les données d'un fichier csv sont généralement stockées dans une liste

L'objectif de cet exercice est l'écriture d'une fonction csv_en_list_de_list(nom) où nom est une chaine de caractère qui renvoie une liste de la liste obtenue avec la fonction reader.

  1. par extension
  2. par compréhension

Vous testerez votre fonction avec le fichier test.csv précédent

Code de déblocage de la correction :

IMPORTANT !

Ecrire un fonction impor(nom) qui reçoit un paramètre nom de type chaîne de caractères qui est le nom du fichier csv sans l'extension et qui retourne une liste de dictionnaire qui contient les informations du fichier csv.

Vous testerez votre fonction sur le fichier précédent.

Code de déblocage de la correction :

  1. C'est cette fonction que l'on peut considérer comme l'importation d'une table csv en Python.
  2. Au vu de la première partie c'est la fonction DictReader() qu'il faut favoriser afin d'avoir une représentation des données attendues.

La commande with open(...) as ...

Il existe en Python une commande qui permet d'ouvrir un fichier csv sans obligation de le fermer à la fin de l'exécution la commande gère la fermeture).

with open(nom_du_fichier,'r') as sortie

Ici on ouvre le fichier "nom_du_fichier" en lecture et on stocke cette ouverture dans la variable sortie.

On pourra remplacer le "r" par "w" pour écrire.

Export d'un fichier csv

Maintenant nous savons ouvrir un fichier csv en Python. L'objectif de ce chapitre est de comprendre comment on exporte un fichier csv à partir de Python. Une situation classique serait l'ouverture d'un fichier csv avec Python(import) on obtient une table puis on la modifie et on enregistre les modifications dans un csv(export).

Voyons dans l'exemple suivant comment créer un fichier csv correspondant à une table donnée.

Conversion d'une table en fichier csv

Pour l'exemple nous allons travailler avec cette table:


table_exemple=[{'nom': 'Dupont', 'prenom': 'Jean-Claude', 'age': '32'},{'nom': 'Duteil', 'prenom': 'Paul', 'age': '41'},{'nom': 'Claudon', 'prenom': 'Goery', 'age': '37'},{'nom': 'Tonton', 'prenom': 'Pierre', 'age': '54'},{'nom': 'Penard', 'prenom': 'Bob', 'age': '18'},{'nom': 'Herpoix', 'prenom': 'Stephane', 'age': '55'},{'nom': 'Salicorne', 'prenom': 'Bruno', 'age': '15'},{'nom': 'Poiteau', 'prenom': 'Maxe', 'age': '33'},{'nom': 'Clanget', 'prenom': 'Gilles', 'age': '54'},{'nom': 'Luillier', 'prenom': 'Martin', 'age': '34'},{'nom': 'Clanget', 'prenom': 'Justine', 'age': '14'},{'nom': 'Gillier', 'prenom': 'Paul', 'age': '16'}]
			

Voila la fonction qui va permettre de créer un fichier csv portant le nom table_exemple.csv correspondant à la table précédente


def vers_csv(nom_de_la_table,ordre,nom_du_fichier_csv):
    table=eval(nom_de_la_table)
    with open(nom_du_fichier_csv+'.csv',"w") as fic:
        dic=csv.DictWriter(fic,fieldnames=ordre)
        dic.writeheader()        
        for ligne in table:
            dic.writerow(ligne)
    return None
			

Tester ce code.

  1. Cette fonction vers_csv() est très importante.
  2. Il faut comprendre l'ensemble des lignes de ce script

L'objectif de cet exercice est d'obtenir un outil qui permet d'insérer un nouvel enregistrement dans un fichier csv.

  1. Ouvrir le fichier csv à télécharger précédent. Repérer le nom et l'ordre des clés.
  2. Ecrire une fonction ajout("fichier") qui va proposer au lecteur( input) l'implémentation d'un nouvel enregistrement.
  3. Tester cette fonction avec l'enregistrement correspondant Danlta Alphonse qui a eu respectivement 15 16 et 11

Code de déblocage de la correction :

Opérations sur les tables

Dans cette deuxième partie nous utiliserons la fonction précédente vers_liste

Sélectionner des enregistrements suivant certains critères

Ici nous utiliserons le principe des listes par compréhension où nous ajouterons une comparaison


resultat= impor('test')
select_nom = [p for p in resultat if p['nom'] == 'Clanget']
print (select_nom)
			

Lors de la création de notre liste par compréhension, on ajoute seulement les enregistrements dont le champ nom correspond à Clanget

  1. Ecrire une fonction un_critère(nom_du_fichier_csv,nom_du_champ,valeur_a_chercher) qui extrait les enregistrements dont le champ nom_du_champ est valeur_a_chercher. Tester cette fonction avec un_critère('test','nom','Clanget')
  2. Ecrire une fonction deux_critere_ou(nom_du_fichier_csv,nom_du_champ1,valeur_a_chercher1,nom_du_champ2,valeur_a_chercher2) qui extrait les enregistrements dont le champ nom_du_champ1 est valeur_a_chercher1 ou dont le champ nom_du_champ2 est valeur_a_chercher2. Tester cette fonction avec deux_critere_ou('test','nom','clanget','prenom','Paul')
  3. Ecrire une fonction deux_critere_et_non(nom_du_fichier_csv,nom_du_champ1,valeur_a_chercher1,nom_du_champ2,valeur_a_chercher2) qui extrait les enregistrements dont le champ nom_du_champ1 est valeur_a_chercher1 et qui ne contient pas dans le second champ nom_du_champ2 la valeur_a_chercher2. Tester cette fonction avec deux_critere_et_non('test','nom','clanget','prenom','Justine')
  4. Ecrire une fonction deux_critere_ou_non(nom_du_fichier_csv,nom_du_champ1,valeur_a_chercher1,nom_du_champ2,valeur_a_chercher2) qui extrait les enregistrements dont le champ nom_du_champ1 est valeur_a_chercher1 ou qui ne contient pas dans le second champ nom_du_champ2 la valeur_a_chercher2. Tester cette fonction avec deux_critere_ou_non('test','nom','clanget','prenom','Justine')
  5. Ecrire une fonction un_critere_depasse(nom_du_fichier_csv,nom_du_champ,valeur_a_depasser) qui extrait les enregistrements dont le champ nom_du_champ a une valeur qui dépasse valeur_a_depasser. Tester cette fonction avec un_critere_depasse('test','age',50)

Code de déblocage de la correction :

Sélectionner des colonnes

Ici nous utiliserons toujours le principe des listes par compréhension mais l'exemple est plus complexe, concentrez vous sur les lignes qui suivent


resultat=impor('test')
select_colonne= [{cle:ligne[cle] for cle in ligne if cle in ['nom','age']} for ligne in resultat]
print (select_colonne)
			

Lors de la création de notre liste par compréhension, on ajoute seulement les champs nom et age de chaque enregistrement

Ecrire une fonction projection qui reçoit en paramètres une table et une liste d'attributs, puis qui retourne uniquement ces attributs.

Code de déblocage de la correction :

Tri d'une table sur une colonne

Une table étant représentée par une liste, on peut la trier en utilisant la fonction sorted ou la méthode .sort() , avec l’argument supplémentaire key qui est une fonction renvoyant la valeur utilisée pour le tri.

Rappel : la méthode .sort() trie la liste en place, alors que la fonction sorted() renvoie une nouvelle liste correspondant la liste triée, la liste initiale étant laissée intacte.

Pour la suite nous utiliserons la fonction sorted()

On peut trier les chaînes de caractères selon différents critères : ordre lexicographique : ['aaa', 'bb'] longueur : ['bb', 'aaa']


sorted(['aaa', 'bb']) # ordre lexicographique par défaut ['aaa', 'bb']
sorted(['aaa', 'bb'], key=len) # longueur ['bb', 'aaa']
			

L'attribut key, nous permet de choisir le critère de tri, ici len pour longueur

Rechercher les différentes valeur que peut prendre l'attribut key

Afin de faciliter le tri par colonne, nous allons introduire la fonction lambda

Une fonction lambda est une fonction anonyme, c'est en quelque sorte une mini-fonction d'une ligne. On la note ainsi : lambda: entree: sortie


Mais regardons tout de suite un exemple

Afin de bien comprendre la structure d'une fonction lambda, testez les deux codes ci-dessous dans une console pour x=4


def f(x):
     return x*2    

g = lambda x: x*2  

		

Dans l'exemple ci-dessous, nous allons trier la table par note de NSI, le nom de la variable lyceen n'a pas d'importance


ma_table=[{'Nom':'Baron','Prenom':'Paul','NSI':'18','Physique':'16','Maths':'15'},
		{'Nom':'Taillant','Prenom':'Greg','NSI':'1','Physique':'3','Maths':'5'},
		{'Nom':'Gourdy','Prenom':'Zoé','NSI':'14','Physique':'13','Maths':'16'}]

table_triee=sorted(ma_table, key=lambda lyceen: lyceen["NSI"])

print (table_triee)
		

  1. A l'aide de la table que vous avez générée à partir du fichier test.csv, trier cette dernière par âge croissant, puis enregistrer dans un fichier table_age_croi.csv
  2. A l'aide de la table que vous avez générée à partir du fichier test.csv, trier cette dernière par âge décroissant, puis enregistrer dans un fichier table_age_decroi.csv

Code de déblocage de la correction :

Ecrire une fonction tri(table,attribut,decroit=False) qui trie une table selon un attribut de manière croissante dans le cas général et de manière décroissante s'il on écrit True comme troisième argument.

Code de déblocage de la correction :

Jointure de table

Jointure de deux tables selon un champ

La jointure de deux tables selon un champ est une table contenant les enregistrements des valeurs communes correspondant au champ de deux tables.

On considère deux tables :

La jointure de ces deux tables est :

Fonction fusion

Voila un script de la fonction fusion qui réalise la jointure de deux tables selon la clé cle


def fusion(table1,table2,cle):
    table_fusion=[]
    for ligne1 in table1:
        for ligne2 in table2:
            if ligne1[cle]==ligne2[cle]:
                new_ligne=ligne1
                for key in ligne2:                    
                    if key!=cle:
                        new_ligne[key]=ligne2[key]
                table_fusion.append(new_ligne)
    return table_fusion
			

Ecrire une fonction fusion2(table1,table2,cle1,cle2=None) où cle1 n'est pas forcément dans table 2 mais serait équivalente à cle2. par exemple name et nom.

Code de déblocage de la correction :

Générateur aléatoire de questions sur ce chapitre

Il faut actualiser la page pour changer de question. Propriétaire de la ressource : le site GeNumsi en licence CC BY_NC-SA

Licence Creative Commons
Les différents auteurs mettent l'ensemble du site à disposition selon les termes de la licence Creative Commons Attribution - Pas d’Utilisation Commerciale - Partage dans les Mêmes Conditions 4.0 International