Aller au contenu

Traitement de données CSV (Comma-Separated Value) avec Python

Allez sur https://console.basthon.fr/

N'oubliez pas de sauvegarder régulièrement votre travail dans un dossier appelé NSI_VOTRE_PRENOM pour pouvoir le récupérer ensuite si besoin. Nommez le fichier traitement_donnees_activite_1.py et sauvegardez le régulièrement dans ce dossier.

  • Uploadez les fichiers contenant les données pour les deux groupes de première.

groupe1
groupe2

1) Importer un fichier CSV et filtrer les données

Nous allons utiliser la classe DictReader de la librairie. Celle-ci transformera chacune des lignes du CSV en un dictionnaire : https://docs.python.org/3/library/csv.html#csv.DictReader

  • Corrigez la fonction ci-dessous qui doit permettre de récupérer dans une liste les élèves internes de Première 4, et de retourner cette liste.
import csv

def liste_eleves(nom_fichier):
    eleves = []
    with open(nom_fichier) as fichier_csv:
            reader = csv.DictReader(fichier_csv, delimiter=';')
            for eleve in reader:
                # TODO : CORRIGER CETTE LIGNE
                if eleve['Classe'] != "PREMIERE 4" or eleve['Regime'] = "Interne":
                    # TODO :  AJOUTER CHAQUE ELEVE A LA LISTE ELEVES

    return eleves
  • Vérifiez que le résultat est bien correct en utilisant un des fichiers CSV (affichez le résultat par exemple).

2) Fusionner sans doublons

On peut distinguer 2 cas de fusions des données:

Concaténation :on ajoute des lignes de données présentes dans la table 2 à la table 1
Jointure :On ajoute des descripteurs présents dans la table 2 à ceux présents dans la table 1

Nous allons concaténer les deux fichiers.

Pour ajouter des données à l'affilée, vous pouvez utiliser la fonction extend qui modifie une liste sur place (c'est à dire qu'elle ne crée pas de nouvelle liste mais modifie directement la liste existante), dont la syntaxe est :

liste1.extend(liste2)
  • Ajoutez un paramètre tous_eleves à la fonction liste_eleves qui vous permettra de sélectionner tous les élèves du fichier lorsque tous_eleves est à True

  • Exécutez la fonction modifiée sur les deux fichiers et fusionner ensuite les deux fichiers (voir code ci-dessous)

    eleves_groupes_1_2 = liste_eleves("nsi_eleves_groupe1.csv", True)
    eleves_groupe_2 = liste_eleves("nsi_eleves_groupe2.csv", True)
    
    # TODO : fusionner les deux listes
    eleves_groupes_1_2.#COMPLETER
    

  • Supprimer les doublons en complétant et en appelant cette fonction :

def supprimer_doublons(eleves):
    eleves_sans_doublons = []
    for eleve in eleves:
        # TODO: COMPLETER
    return eleves_sans_doublons

eleves_groupes_1_2 = supprimer_doublons(eleves_groupes_1_2)

3) Sauvegarder le fichier et trier les données

On souhaite obtenir une liste des élèves triés par classe (ordre croissant). Vous pouvez utiliser la fonction sort de Python : https://docs.python.org/fr/3/howto/sorting.html

La fonction sorted spécifie un paramètre key qui va nous permettre de préciser sur quelles valeurs on va effectuer le tri. Pour trier les données on va passer comme argument une fonction anonyme (fonction lambda). Pour le moment vous n'avez pas forcément à comprendre ce dont il s'agit, ce sera des notions que l'on abordera (sans rentrer dans les détails) en Terminale.

'w' (write) dans la fonction open permet de spécifier que l'on souhaite écrire les données dans un fichier.

  • Récupérer les clés du dictionnaire (qui correspondent aux descripteurs du fichier CSV).
  • Modifier la clé 'LA_CLE_DICTIONNAIRE' pour pouvoir trier les données par classe.
colonnes = #1. RECUPERER LES CLES DU DICTIONNAIRE

with open('nsi_eleves_groupe_1_2_trie.csv', 'w', newline='') as fichier_trie:
    csv_eleves_trie = csv.DictWriter(fichier_trie, fieldnames=colonnes)
    csv_eleves_trie.writeheader()
    # 2. modifier la clé du dictionnaire
    csv_eleves_trie.writerows(sorted(eleves_groupes_1_2, key=lambda d: d['LA_CLE_DICTIONNAIRE']))

Bravissimo

Bravo ! Lorsque vous avez rendu votre travail supprimez votre fichier du disque dur