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
.
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'}]
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.
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.
Vous testerez votre fonction avec le fichier test.csv précédent
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.
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.
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.
vers_csv()
est très importante.L'objectif de cet exercice est d'obtenir un outil qui permet d'insérer un nouvel enregistrement dans un fichier csv.
ajout("fichier")
qui va proposer au lecteur( input) l'implémentation d'un nouvel enregistrement.Dans cette deuxième partie nous utiliserons la fonction précédente vers_liste
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
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')
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')
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')
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')
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)
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.
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)
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.
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.
Il faut actualiser la page pour changer de question. Propriétaire de la ressource : le site GeNumsi en licence CC BY_NC-SA
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