NSI - Terminale - Traitement des données en table
Travail demandé
Partie 1: Importer une table depuis un fichier CSV
Vous allez construire un logiciel Python de gestion de notes d'une classe fictive.
Au départ les notes sont sauvegardées dans un fichier au format csv.
Vous pouvez consulter le menu Ressources pour comprendre comment sont organisées les données dans un fichier csv et comment les manipuler avec Python.
Vous disposez du fichier eleve.csv (Cliquer-ici pour le télécharger) dont voici un extrait:
Exercice 1
- Compléter la définition de la fonction charger_donnees(nom_fichier) qui crée une liste de dictionnaires assignée à la variable enregistrements à partir des données du fichier csv passé en argument. La fonction renvoie cette liste de dictionnaires:
import csv
def charger_donnees(nom_fichier):
# liste de dictionnaires au départ vide
enregistrements = []
'''on ouvre le fichier en mémoire et
on l'assigne à la variable fichier'''
with open(nom_fichier, encoding='utf-8') as fichier:
# A Compléter
.........
# on referme le fichier
fichier.close()
# A Compléter: on renvoie la liste de dictionnaires
return ......
# Utilisation de la fonction et affichage de la liste
print("voici les données importées: \n", charger_donnees("eleves.csv"))
- Tester votre code et le copier dans votre compte rendu comme réponse de l'exercice 1.
Exercice 2
A l'issue de l'importation, vous avez une liste de dictionnaires, chaque dictionnaire correspond à un élève.
Exemple:
{'Prénom': 'Adémar', 'Nom': 'Aucardetour', 'date_de_naissance': '12-12-04', 'classe': '1G8', 'ds1': '12', 'ds2': '10', 'ds3': '14.5'}
La valeur associée à chaque clé du dictionnaire est une chaine de caractères ce qui ne permet pas d'effectuer des calculs avec les valeurs, par exemple vous ne pouvez pas calculer de la moyenne des DS d'un élève. Dans cet exercice vous allez concevoir une fonction appelée convertir_en_nombre(valeur), cette fonction prend en argument la valeur associée à une clé et la transforme en nombre flottant lorsque c'est pertinent (pour la valeur d'une clé 'ds..').
Question 2.1
- Compléter le code python ci-dessous:
def convertir_en_nombre(valeur):
# si la valeur est None, on renvoie une chaine vide
if valeur is None:
return ""
# si pas de valeur, on renvoie une chaine vide
if valeur == "":
return ""
# gestion d'exception: tentative de conversion
try:
# A compléter
....................
# exception: si impossible de convertir, renvoyer tel quel,
# agira pour la valeur des clés nom, prenom et date de naissance
except:
return valeur
# utilisation de la fonction:
enregistrements = charger_donnees("eleves.csv")
for dico in enregistrements:
for cle in dico:
# A completer (convertir valeur associée à cle)
dico[cle] = ......................
- Copier le code complété dans votre compte rendu comme réponse de la question 2.1.
Question 2.2
Dans cet exercice vous allez tester la correction de votre fonction avec des assertions. On vous propose une définition de fonction appelée test_convertir_en_nombre() à compléter qui teste des possibilités de valeur de clés pour vérifier si la fonction convertir_en_nombre(valeur) est correcte:
def test_convertir_en_nombre():
# si la valeur de la clé vaut None, la fonction renvoie ""
assert convertir_en_nombre(None) == ""
# si la valeur de la clé vaut "", la fonction renvoie ""
assert convertir_en_nombre("") == ""
# si la valeur de la clé vaut 'Adémar', la fonction renvoie 'Adémar'
assert convertir_en_nombre('Adémar') == 'Adémar'
# A COMPLETER:
# si la valeur de la clé est '10'
........
# si la valeur de la clé est '12.5'
........
print("code OK, assertions franchies")
- Compléter le code de la fonction test_convertir_en_nombre() et la tester. Copier le code complété dans votre compte rendu comme réponse de la question 2.2
Exercice 3
Dans cet exercice vous allez coder la définition de la fonction calculer_moyenne(enregistrements, nom) qui prend en arguments: une liste de dictionnaires dont la valeur de chaque clé "ds.." a été convertie en nombre flottant, la fonction calcule la moyenne de ds1, ds2, ds3, etc.. pour l'élève passé en argument à la variable nom. Par exemple:
enregistrements = [ {'Prénom': 'Adémar', 'Nom': 'Aucardetour', 'date_de_naissance': '12-12-04', 'classe': '1G8', 'ds1': 12.0, 'ds2': 10.0, 'ds3': 14.5}, ..... ]
calculer_moyenne(enregistrements, 'Aucardetour') doit renvoyer 12.17 c'est à dire la moyenne d'Adémar Aucardetour arrondie à deux décimales.
def calculer_moyenne(enregistrements, nom):
# A compléter
- Coder la définition de la fonction calculer_moyenne(enregistrements, nom) et la tester. Copier le code complété dans votre compte rendu comme réponse de l'exercice 3
Exercice 4
Dans cette exercice vous allez compléter la fonction trier_les_données(enregistrements, critere) qui permet de trier la liste de dictionnaires associée à la variable enregistrements selon le descripteur associé à la variable critere. La fonction renvoie une copie de la liste de dictionnaires triée. Exemple:
Avec le code ci-dessous, la variable table recevrait de la fonction trier_les_données(...) une copie triée dans l'ordre croissant, selon le descripteur ds3, de la liste de dictionnaires liste_dicos qui est passée en argument à la fonction:
def trier_les_données(enregistrements, critere):
# A compléter
copie_liste = sorted(....., key=lambda dico:dico[......])
return .............
liste_dicos = [ {'Prénom': 'Adémar', 'Nom': 'Aucardetour', 'date_de_naissance': '12-12-04',
'classe': '1G8', 'ds1': 12.0, 'ds2': 10.0, 'ds3': 14.5}, ..... ]
# utilisation de la fonction avec le tri selon le ds3
table = trier_les_données(liste_dicos, 'ds3').
Résultat du tri:
- Compléter la définition de la fonction trier_les_données(enregistrements, critere) ci-dessus et la tester. Copier le code complété dans votre compte rendu comme réponse de l'exercice 4
Exercice 5
Dans cet exercice vous allez fusionner les données de deux tables qui sont codées chacune avec une liste de dictionnaires, la fonction fusionner(table_1, table_2, id) prend trois arguments, la variable table_1 qui est assignée à une liste de dictionnaires lors de l'utilisation de la fonction , la variable table_2 qui est assignée à une autre liste de dictionnaires et la variable id qui est assignée à un nombre représentant l'identifiant d'un élève, l'identifiant d'un élève est unique et commun aux deux tables, il permet d'identifier de manière certaine un élève. La fonction fusionner (..) renvoie un dictionnaire qui est la fusion des deux dictionnaires pour les données correspondantes à l'id passé en argument.
Par exemple:
notes_spé = [ { 'id':12345678, 'maths': 12.0, 'nsi': 15.0, 'arts': 14.5}, ..... ]
données_admin = [ {'id':12345678,'Prénom': 'Adémar', 'Nom': 'Aucardetour', 'date_de_naissance': '12-12-04',
'classe': '1G8', 'tel': '0678678905', 'adresse': '3 rue du marché', 'ville': '84200 Carpentras'}, ..... ]
resultat = fusionner(données_admin , notes_spé, 12345678)
Donnera:
resultat = { 'id':12345678, 'Prénom': 'Adémar', 'Nom': 'Aucardetour', 'date_de_naissance': '12-12-04', 'classe': '1G8', 'tel': '0678678905', 'adresse': '3 rue du marché', 'ville': '84200 Carpentras' 'maths': 12.0, 'nsi': 15.0, 'arts': 14.5 }
- Compléter la définition de la fonction fusionner(table_1, table_2, id) et la tester avec les données proposées ci-dessous. Copier le code complété dans votre compte rendu comme réponse de l'exercice 5
def fusionner(table_1, table_2, id):
# dictionnaire fusion des deux tables
dico = {}
# A compléter
.....................
return dico
notes_spé = [ { 'id':12345678, 'maths': 12.0, 'nsi': 15.0, 'arts': 14.5},
{ 'id':12345679, 'maths': 12.0, 'nsi': 15.0, 'PhC': 12.5} ]
données_admin = [
{'id':12345678,
'Prénom': 'Adémar',
'Nom': 'Aucardetour',
'date_de_naissance': '12-12-04',
'classe': '1G8',
'tel': '0678678905',
'adresse': '3 rue du marché',
'ville': '84200 Carpentras'},
{'id':12345679,
'Prénom': 'Yann',
'Nom': 'Amarre',
'date_de_naissance': '05-06-04',
'classe': '1G8',
'tel': '0688690935',
'adresse': '4 bd du Mt Ventoux',
'ville': '84200 Carpentras'}
]
# test de la fonction, à compléter:
..................................