Aller au contenu

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

Dossier NSI_Tables_Donnees 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
from fonctions_csv import *

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 :

  1. Dans l'interface, repérez, en bas à droite, l'Explorateur de fichiers : Pyzo 01
  2. En cliquant sur l'icône , on remonte d'un dossier.
    En cliquant sur un dossier, on l'ouvre : Pyzo 03
  3. Rendez-vous dans le dossier [NSI_Tables_Donnees].
    Une fois dans ce dossier, cliquer sur l'étoile : Pyzo 04
  4. 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)] : Pyzo 06

  5. Dans la console, le changement de dossier est effectif : Pyzo 07

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
def importe_csv(nom_fichier):
    with open(nom_fichier, 'r', encoding="utf-8", newline='') as fichier:
        lecteur = csv.DictReader(fichier,  delimiter=',')
        return [dict(ligne) for ligne in lecteur]
1. Cette fonction ouvre le fichier en mode lecture (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.

  1. Téléchargez la table de données personnes.csv puis enregistrez ce fichier dans le répertoire [NSI_Tables_Donnees].
  2. 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
  1. Ouvrez un éditeur Python, sauvegardez le programme sous le nom TPC01.21.py dans le dossier [NSI_Tables_Donnees].
  2. Entrez la ligne d'importation du module fonctions_csv.py comme précisé dans le paragraphe introductif :
    1
    from fonctions_csv import *
    
  3. Ajoutez à ce programme les instructions nécessaires afin :

    1. d'importer le fichier personnes.csv et enregistrer ses données dans une variable nommée table ;
    2. 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)
    

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 fonction int()...

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.

  1. Téléchargez le fichier à compléter TPC01.22.py puis enregistrez-le dans votre répertoire de travail.

  2. 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 ?

  3. 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())
    
  4. 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
def exporte_csv(nom_table, nom_fichier, ordre):
    with open(nom_fichier, 'w',  encoding="utf-8", newline='') as fichier:
        # Préparation de la table de données
        donnees = csv.DictWriter(fichier, fieldnames=ordre)
        # Écriture de la première ligne (attributs dans l'ordre)
        donnees.writeheader()
        # Ajout de toutes les lignes
        donnees.writerows(nom_table)
1. Cette fonction ouvre le fichier en mode écriture (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...

  1. 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 module csv. Plus d'infos ici.

  2. 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
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'}]

  1. 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].

  2. Entrez la ligne d'importation du module du module fonctions_csv.py comme précisé dans le paragraphe introductif :

    1
    from fonctions_csv import *
    

  3. 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'])
    
  4. 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'])