Manipuler des Tables de Données☘
Rappels
Dans ce chapitre (et le suivant), vous allez devoir :
- enregistrer, créer et exploiter des fichiers au format CSV ;
- importer les données d'un fichier CSV dans un programme Python ;
- exporter des informations issues d'un programme vers un fichier au format CSV ;
- sélectionner et extraire des données parmi toutes les données importées ;
- trier les données selon certains critères ;
- fusionner des données (jointure de tables).
Préparation du répertoire de travail
1. Dans votre répertoire courant, créez un dossier nommé [NSI_Tables_Donnees]
.
2. Dans ce dossier, enregistrez les fichiers CSV ainsi que les programmes
réalisés au cours de ce chapitre (et du suivant).
Dans le dossier [NSI_Tables_Donnees]
, téléchargez et enregistrez le module
fonctions_csv.py. Ce fichier contient toutes les
fonctions indispensables pour effectuer les actions listées dans les rappels
ci-dessus.
Les programmes réalisés au cours de ce chapitre (et du suivant) devront
être placés dans le dossier [NSI_Tables_Donnees]
.
De plus, ils devront commencer par l'importation du module
fonctions_csv.py
, c'est-à-dire par l'instruction :
1 |
|
Remarque importante pour ceux qui utilisent Pyzo
Pour travailler sur des fichiers avec Pyzo, le plus simple est de déplacer le shell dans le répertoire de travail. Pour cela :
- Dans l'interface, repérez, en bas à droite, l'Explorateur de fichiers :
- En cliquant sur l'icône , on remonte d'un dossier.
En cliquant sur un dossier, on l'ouvre : - Rendez-vous dans le dossier
[NSI_Tables_Donnees]
.
Une fois dans ce dossier, cliquer sur l'étoile : -
L'étoile devient jaune, avec un petite flèche en bas à droite.
Cliquez sur cette petite flèche et sélectionnez [Allez dans ce dossier (shell courant)] : -
Dans la console, le changement de dossier est effectif :
Vous pouvez désormais travailler (importer/exporter) avec les fichiers
CSV qui seront placés dans le dossier [NSI_Tables_Donnees]
.
TPC01.21 - Importer un fichier CSV☘
Cette activité a pour but de vous familiariser avec la fonction importe_csv()
définie dans le module fonctions_csv.py.
Cette fonction prend pour paramètre une chaîne de caractères contenant le nom
du fichier CSV à importer.
Pour en savoir plus
La fonction importe_csv()
permet de lire le fichier CSV dont le nom
(chemin relatif sous forme de chaîne de caractères et terminant par .csv
)
est passé en paramètre :
1 2 3 4 |
|
r
), avec
l'encodage de caractères UTF-8.2. Elle stocke ensuite les lignes du fichiers lus dans un objet de type
DictReader
(on ne s'étendra pas sur cet objet spécifique au module csv
.
Plus d'infos sur ce module ici).3. Elle renvoie ensuite la liste constituée du dictionnaire formé par la ligne, pour chaque ligne lue dans le fichier CSV.
Cette fonction étant définie dans le module fonctions_csv.py évoqué dans le paragraphe précédent, il est inutile de recopier ce code. Il suffira d'importer le module précédent pour pouvoir utiliser cette fonction.
- Téléchargez la table de données
personnes.csv
puis enregistrez ce fichier dans le répertoire[NSI_Tables_Donnees]
. - Vérifiez, à l'aide d'un tableur ou d'un éditeur que les premières lignes de cette table sont :
id_personne | nom | prenom | annee_naissance |
---|---|---|---|
1 | Labrosse | Adam | 2000 |
2 | Gemlamorte | Adèle | 1985 |
3 | Auboisdormant | Abel | 2001 |
4 | Etpan | Ahmed | 1975 |
5 | Térieur | Alain | 1999 |
- Ouvrez un éditeur Python, sauvegardez le programme sous le nom
TPC01.21.py
dans le dossier[NSI_Tables_Donnees]
. - Entrez la ligne d'importation du module
fonctions_csv.py
comme précisé dans le paragraphe introductif :1
from fonctions_csv import *
-
Ajoutez à ce programme les instructions nécessaires afin :
- d'importer le fichier
personnes.csv
et enregistrer ses données dans une variable nomméetable
; - de visualiser dans la console le contenu du fichier CSV après exécution programme.
Affichage à obtenir
>>> (executing file "TPC01.21.py") {'id_personne': '1', 'nom': 'Labrosse', 'prenom': 'Adam', 'annee_naissance': '2000'} {'id_personne': '2', 'nom': 'Gemlamorte', 'prenom': 'Adèle', 'annee_naissance': '1985'} {'id_personne': '3', 'nom': 'Auboisdormant', 'prenom': 'Abel', 'annee_naissance': '2001'} {'id_personne': '4', 'nom': 'Etpan', 'prenom': 'Ahmed', 'annee_naissance': '1975'} {'id_personne': '5', 'nom': 'Térieur', 'prenom': 'Alain', 'annee_naissance': '1999'} {'id_personne': '6', 'nom': 'Térieur', 'prenom': 'Alex', 'annee_naissance': '1976'} {'id_personne': '7', 'nom': 'Proviste', 'prenom': 'Alain', 'annee_naissance': '2000'} {'id_personne': '8', 'nom': 'Verse', 'prenom': 'Alain', 'annee_naissance': '1970'} {'id_personne': '9', 'nom': 'Ception', 'prenom': 'Alex', 'annee_naissance': '2001'} {'id_personne': '10', 'nom': 'Ainé', 'prenom': 'Ali', 'annee_naissance': '1975'} {'id_personne': '11', 'nom': 'Gator', 'prenom': 'Ali', 'annee_naissance': '2001'} {'id_personne': '12', 'nom': 'Bistraux', 'prenom': 'Alonzo', 'annee_naissance': '2001'} {'id_personne': '13', 'nom': 'Patamob', 'prenom': 'Alphonse', 'annee_naissance': '1970'} {'id_personne': '14', 'nom': 'Ficulté', 'prenom': 'Andy', 'annee_naissance': '1980'} {'id_personne': '15', 'nom': 'Rectdustade', 'prenom': 'Andy', 'annee_naissance': '2000'} {'id_personne': '16', 'nom': 'Verserre', 'prenom': 'Annie', 'annee_naissance': '2001'} {'id_personne': '17', 'nom': 'Boréal', 'prenom': 'Aurore', 'annee_naissance': '1985'} {'id_personne': '18', 'nom': 'Nor', 'prenom': 'Paul', 'annee_naissance': '1985'} {'id_personne': '19', 'nom': 'Dejeu', 'prenom': 'Bernadette', 'annee_naissance': '2001'} {'id_personne': '20', 'nom': 'Dajeun', 'prenom': 'Bruno', 'annee_naissance': '1984'} {'id_personne': '21', 'nom': 'Hiple', 'prenom': 'Candice', 'annee_naissance': '2000'}
Une réponse
1 2 3 4 5
from fonctions_csv import * table = importe_csv('personnes.csv') for dico in table: print(dico)
- d'importer le fichier
Conséquence
- Les lignes sont représentées par des dictionnaires ayant les mêmes clés.
- Les valeurs de chaque clé sont des chaînes de caractère.
Si l'on veut que l'année de naissance soit un entier, il faudra modifier dans chaque dictionnaire la valeur associée à cette clé à l'aide de la fonctionint()
...
TPC01.22 - Récupérer des informations☘
Cette activité a pour but de poursuivre le travail précédent.
Tests
En plus des tests sur la table de données
personnes.csv
, il faudra compléter en important
et testant sur la table de données
Zelda_Consoles.csv
.
-
Téléchargez le fichier à compléter TPC01.22.py puis enregistrez-le dans votre répertoire de travail.
-
Complétez la définition de la fonction
nb_lignes()
en respectant ses spécifications :1 2 3 4 5 6
def nb_lignes(table): """ table - list, Table de données représentée par un tableau de dictionnaires ayant tous les mêmes clés Sortie: int - nombre de lignes de données de cette table """
Affichages à obtenir
À partir du fichier
personnes.csv
:>>> table = importe_csv('personnes.csv') >>> nb_lignes(table) 21
À partir du fichier
Zelda_Consoles.csv
:>>> table2 = importe_csv('Zelda_Consoles.csv') >>> nb_lignes(table2) 14
Une piste
Comment obtenir le nombre d'enregistrement de la table de données sachant qu'elle est représentée en Python par un tableau de dictionnaires ?
-
Complétez la définition de la fonction
attributs()
en respectant ses spécifications :1 2 3 4 5 6
def attributs(table): """ table - list, Table de données représentée par un tableau de dictionnaires ayant les mêmes clés Sortie: list – tableau des attributs de la table de données """
Affichages à obtenir
À partir du fichier
personnes.csv
:>>> table = importe_csv('personnes.csv') >>> attributs(table) ['id_personne', 'nom', 'prenom', 'annee_naissance']
À partir du fichier
Zelda_Consoles.csv
:>>> table2 = importe_csv('Zelda_Consoles.csv') >>> attributs(table2) ['titre', 'console', 'sortie_japon', 'sortie_france', 'développeur', 'nombre_rééditions']
Une solution
Tous les dictionnaires ayant les mêmes clefs, il suffit de récupérer les clefs du premier dictionnaire du tableau.
1 2 3 4 5 6 7 8 9 10
def attributs(table): """ table - list, Table de données représentée par un tableau de dictionnaires ayant les mêmes clés Sortie: list – tableau des attributs de la table de données """ tab = [] for clef in table[0].keys(): tab.append(clef) return tab
Une autre solution
1 2 3 4 5 6 7
def attributs(table): """ table - list, Table de données représentée par un tableau de dictionnaires ayant les mêmes clés Sortie: list – tableau des attributs de la table de données """ return [clef for clef in table[0].keys()]
Une dernière solution
1 2 3 4 5 6 7
def attributs(table): """ table - list, Table de données représentée par un tableau de dictionnaires ayant les mêmes clés Sortie: list – tableau des attributs de la table de données """ return list(table[0].keys())
-
Complétez la définition de la fonction
attributs_entiers()
en respectant ses spécifications :1 2 3 4 5 6
def attributs_entiers(table, tab_attributs): """ table - list, Table de données représentée par un tableau de dictionnaires ayant les mêmes clés tab_attributs - list, tableau de chaîne de caractères étant des clés de cette table Sortie: None - Modifie table dans laquelle les clés attributs ont des valeurs entières (fonction à effet de bord) """
Affichages à obtenir
À partir du fichier
personnes.csv
:>>> table = importe_csv('personnes.csv') >>> table[0] {'id_personne': '1', 'nom': 'Labrosse', 'prenom': 'Adam', 'annee_naissance': '2000'} >>> attributs_entiers(table, ['id_personne', 'annee_naissance']) >>> table[0] {'id_personne': 1, 'nom': 'Labrosse', 'prenom': 'Adam', 'annee_naissance': 2000}
À partir du fichier
Zelda_Consoles.csv
:>>> table2 = importe_csv('Zelda_Consoles.csv') >>> table2[8] {'titre': 'The Wind Waker', 'console': 'GameCube', 'sortie_japon': '2002', 'sortie_france': '2003', 'développeur': 'Nintendo', 'nombre_rééditions': '1'} >>> attributs_entiers(table2, ['sortie_japon', 'sortie_france', 'nombre_rééditions']) >>> table2[8] {'titre': 'The Wind Waker', 'console': 'GameCube', 'sortie_japon': 2002, 'sortie_france': 2003, 'développeur': 'Nintendo', 'nombre_rééditions': 1}
Une solution
Tous les dictionnaires ayant les mêmes clefs, il suffit de récupérer les clefs du premier dictionnaire du tableau.
1 2 3 4 5 6 7 8 9 10
def attributs_entiers(table, tab_attributs): """ table - list, Table de données représentée par un tableau de dictionnaires ayant les mêmes clés tab_attributs - list, tableau de chaîne de caractères étant des clés de cette table Sortie: None - Modifie table dans laquelle les clés attributs ont des valeurs entières (fonction à effet de bord) """ for ligne in table: for clef, valeur in ligne.items(): if clef in tab_attributs: ligne[clef] = int(valeur)
Remarque
Cette fonction est définie par défaut dans le module
[fonctions_csv.py](bases/fonctions_csv.py)
donc si vous en avez besoin par la suite, il est inutile de la reprogrammer.
TPC01.23 - Exporter un fichier CSV☘
Cette activité a pour but de vous familiariser avec la fonction exporte_csv()
définie dans le module fonctions_csv.py.
Cette fonction nécessite trois paramètres :
- le nom de la variable contenant un tableau de dictionnaires (la table de données) ;
- une chaîne de caractères correspondant au nom du fichier CSV à sauvegarder
(ne pas oublier le suffixe
.csv
) ; - un tableau contenant les attributs (les clefs) de chaque ligne. Ces attributs sont dans l'ordre dans lequel les données doivent être enregistrées dans le fichier CSV.
Pour en savoir plus
La fonction exporte_csv()
permet d'exporter le fichier CSV dont le nom
(chemin relatif sous forme de chaîne de caractères qui se termine par .csv
)
est passé en paramètre :
1 2 3 4 5 6 7 8 |
|
w
), avec
l'encodage de caractères UTF-8.A noter qu'il ne faut pas oublier le suffixe
.csv
à
la fin du nom du fichier...
-
Elle prépare ensuite les attributs du fichier dans un objet de type
DictWriter
(*on ne s'étendra pas sur cet objet spécifique au modulecsv
. Plus d'infos ici. -
Elle écrit ensuite dans le fichier CSV la première ligne constituée des attributs puis chaque nouvelle ligne est uniquement constituée des valeurs correspondant à ces attributs dans l'ordre.
Cette fonction étant définie dans le module fonctions_csv.py évoqué dans le paragraphe précédent, il est inutile de recopier ce code. Il suffira d'importer le module précédent pour pouvoir utiliser cette fonction.
On dispose de la table de données (tableau de dictionnaires) suivante :
3 4 5 6 7 8 9 10 11 |
|
-
Ouvrez un éditeur Python, copiez/collez le code ci-dessus puis sauvegardez le programme sous le nom
TPC01.23.py
dans le dossier[NSI_Tables_Donnees]
. -
Entrez la ligne d'importation du module du module
fonctions_csv.py
comme précisé dans le paragraphe introductif :1
from fonctions_csv import *
-
Ajoutez à ce programme la ligne nécessaire pour exporter cette table de données dans un fichier
BaseAliens.csv
dont le contenu est décrit ci-dessous :NomAlien Sexe Planete NoCabine Zorglub M Trantor 1 Blorx M Euterpe 2 Urxiz M Aurora 3 Zbleurdite F Trantor 4 Darneurane M Trantor 5 Mulzo M Helicon 6 Zzzzzz F Aurora 7 Arghh M Nexon 8 Joranum F Euterpe 9 Une réponse
1 2 3 4 5 6 7 8 9 10 11 12 13
from fonctions_csv import * BaseAliens = [{'NomAlien': 'Zorglub', 'Sexe': 'M', 'Planete': 'Trantor', 'NoCabine': '1'}, {'NomAlien':'Blorx', 'Sexe': 'M', 'Planete': 'Euterpe', 'NoCabine': '2'}, {'NomAlien':'Urxiz', 'Sexe': 'M', 'Planete': 'Aurora', 'NoCabine': '3'}, {'NomAlien':'Zbleurdite', 'Sexe': 'F', 'Planete': 'Trantor', 'NoCabine': '4'}, {'NomAlien':'Darneurane', 'Sexe': 'M', 'Planete': 'Trantor', 'NoCabine': '5'}, {'NomAlien':'Mulzo', 'Sexe': 'M', 'Planete': 'Helicon', 'NoCabine': '6'}, {'NomAlien':'Zzzzzz', 'Sexe': 'F', 'Planete': 'Aurora', 'NoCabine': '7'}, {'NomAlien':'Arghh', 'Sexe': 'M', 'Planete': 'Nexon', 'NoCabine': '8'}, {'NomAlien':'Joranum', 'Sexe': 'F', 'Planete': 'Euterpe', 'NoCabine': '9'}] exporte_csv(BaseAliens, 'BaseAliens.csv', ['NomAlien','Sexe','Planete', 'NoCabine'])
-
Modifiez ce programme afin d'obtenir le fichier
BaseAliens2.csv
dont le contenu est décrit par la table ci-dessous :NoCabine NomAlien Sexe Planete 1 Zorglub M Trantor 2 Blorx M Euterpe 3 Urxiz M Aurora 4 Zbleurdite F Trantor 5 Darneurane M Trantor 6 Mulzo M Helicon 7 Zzzzzz F Aurora 8 Arghh M Nexon 9 Joranum F Euterpe Une réponse
Il suffit de changer l'ordre des attributs lors de l'appel de la fonction
export_csv()
:from fonctions_csv import * BaseAliens = [{'NomAlien': 'Zorglub', 'Sexe': 'M', 'Planete': 'Trantor', 'NoCabine': '1'}, {'NomAlien':'Blorx', 'Sexe': 'M', 'Planete': 'Euterpe', 'NoCabine': '2'}, {'NomAlien':'Urxiz', 'Sexe': 'M', 'Planete': 'Aurora', 'NoCabine': '3'}, {'NomAlien':'Zbleurdite', 'Sexe': 'F', 'Planete': 'Trantor', 'NoCabine': '4'}, {'NomAlien':'Darneurane', 'Sexe': 'M', 'Planete': 'Trantor', 'NoCabine': '5'}, {'NomAlien':'Mulzo', 'Sexe': 'M', 'Planete': 'Helicon', 'NoCabine': '6'}, {'NomAlien':'Zzzzzz', 'Sexe': 'F', 'Planete': 'Aurora', 'NoCabine': '7'}, {'NomAlien':'Arghh', 'Sexe': 'M', 'Planete': 'Nexon', 'NoCabine': '8'}, {'NomAlien':'Joranum', 'Sexe': 'F', 'Planete': 'Euterpe', 'NoCabine': '9'}] exporte_csv(BaseAliens, 'BaseAliens2.csv', ['NoCabine', 'NomAlien','Sexe','Planete'])