Lire un fichier CSV, compter, filtrer, croiser deux tables : le tableur ne fait pas tout
Un tableur est pratique pour explorer. Mais pour répéter un traitement, traiter un très gros fichier ou croiser des tables, un programme est plus sûr et plus rapide. Dans cette partie, tu vas refaire en Python une partie de D2, puis aller plus loin.
Avant de commencer
Mets dans un même dossier ton programme .py et les fichiers 2023_Pyramide.csv, Securite_routiere2.csv (dans Donnees.zip) et Eleves2022.csv (donné en classe). Chaque exercice est un fichier NOM_Prenom_ex05.py. Tu auras besoin des boucles, des conditions et des fonctions du cours Python.
CoursLire un fichier dans un programme
Un fichier CSV est du texte : Python le lit ligne par ligne. Chaque ligne est un texte, qu'on découpe avec .split(";") pour obtenir ses colonnes. On range tout dans une liste de listes : la table.
lire_table.py
deflire_table(nom):
"""Lit un fichier CSV et renvoie la table : une liste de lignes,
chaque ligne étant une liste de textes (un texte par colonne)."""
table = []
with open(nom, encoding="cp1252") as fichier:
for ligne in fichier:
table.append(ligne.strip().split(";"))
return table
open(nom, encoding="cp1252") ouvre le fichier ; with … as fichier le referme automatiquement. L'encodage cp1252 lit les accents des fichiers français de ce thème.
.strip() enlève le retour à la ligne de fin ; .split(";") coupe le texte à chaque point-virgule.
Le résultat est une liste : table[0] est la première ligne, table[2] la troisième ; table[2][3] est la quatrième colonne de la troisième ligne.
108['Année de naissance', 'Âge révolu', "Nombre d'hommes", 'Nombre de femmes']['2022', '0', '345538', '330929']
Attention
Dans la liste, tout est du texte : '345538' n'est pas le nombre 345538. Pour calculer, il faut convertir avec int(...) (nombre entier). Et les indices commencent à 0 : la colonne « Nombre d'hommes » est ligne[2].
CoursBoîte à outils
Besoin
En Python
Exemple
Convertir un texte en nombre
int(texte)
int(ligne[2])
Une partie de la liste (une tranche)
liste[debut:fin] (la fin est exclue)
table[2:103] : lignes d'indices 2 à 102
Tester l'appartenance
valeur in liste
"MATHEMATIQUES" in ligne[6:11]
Compter : un compteur
n = 0 puis n = n + 1 dans la boucle
if ligne[1] == "F": n = n + 1
Compter par catégorie : un dictionnaire
dico[cle] (voir ci-dessous)
effectifs[age] = effectifs[age] + 1
dictionnaire.py
effectifs = {}
for age in [20, 18, 20, 21, 20]:
if age in effectifs:
effectifs[age] = effectifs[age] + 1else:
effectifs[age] = 1print(effectifs)
console
{20: 3, 18: 1, 21: 1}
Un dictionnaire associe une clé (ici l'âge) à une valeur (ici l'effectif) : c'est un compteur par catégorie, sans avoir à connaître les catégories à l'avance.
ExercicesLa population en Python
EX 23Je découvre🌶️prise en main
Exercice 23 — Lire la pyramide des âges
Dans un fichier, recopie la fonction lire_table du cours, puis ajoute :
Exécute le programme. Que représente le premier nombre affiché ?
Quel est le type de table[2][2] ? Vérifie avec print(type(table[2][2])).
Que faut-il faire pour utiliser table[2][2] dans un calcul ? Affiche int(table[2][2]) * 2.
Indice
Les lignes de la table sont les lignes du fichier : titre, descripteurs, 101 lignes de population, « Total », une ligne vide, trois lignes de notes.
💾 NOM_Prenom_ex23.py
EX 24Je m'entraîne🌶️🌶️application
Exercice 24 — Les totaux de la population
Avec une boucle sur table[2:103] (les 101 lignes de population), calcule :
le nombre total d'hommes et le nombre total de femmes ;
la proportion de femmes dans la population, en pourcentage arrondi à 0,1.
Indice
Utilise deux compteurs (hommes et femmes) qui valent 0 au départ. Dans la boucle : hommes = hommes + int(ligne[2]).
💾 NOM_Prenom_ex24.py
EX 25Je m'entraîne🌶️🌶️🌶️plusieurs étapes
Exercice 25 — L'âge moyen des Français
L'âge moyen d'une population se calcule ainsi : pour chaque âge, on multiplie l'âge par le nombre de personnes de cet âge ; on additionne tous ces produits ; on divise par la population totale.
Écris un programme qui calcule l'âge moyen. (Attention à la ligne « 100 ou plus » : on prendra 100 ans.)
Écris la fonctionage_moyen(table) qui renvoie ce nombre, puis affiche round(age_moyen(table), 1).
Indice 1
Pour la ligne « 100 ou plus » : ligne[1].split()[0] donne '100' (le premier mot). Pour les autres, c'est le seul mot : '15'.
Indice 2
Deux compteurs : total_personnes et somme_ages.
💾 NOM_Prenom_ex25.py
ExercicesLe lycée en Python
EX 26Je m'entraîne🌶️prise en main
Exercice 26 — Retrouver 916 et 39
Lis Eleves2022.csv avec lire_table. La première ligne contient les descripteurs : on la saute avec table[1:].
Combien de lignes contient la table ? Combien d'élèves sont encore présents (colonne Sortie vide, soit ligne[2] == "") ?
Combien d'élèves de terminale (classe qui commence par T : ligne[0][0] == "T") ont l'italien en LVB (ligne[5] == "ITALIEN") ? Compare avec ton résultat du tableur.
Indice
eleves = lire_table("Eleves2022.csv")[1:] donne la table sans la ligne des descripteurs.
💾 NOM_Prenom_ex26.py
EX 27Je m'entraîne🌶️🌶️application
Exercice 27 — Une fonction qui compte
Écris une fonction compter(table, colonne, valeur) qui renvoie le nombre d'élèves présents dont la colonne colonne vaut valeur.
Utilise-la pour compter les élèves présents par LVB (colonne 5) : "ESPAGNOL", "ALLEMAND", "ITALIEN". Vérifie que la somme est 916.
Indice
Le test d'un élève présent est ligne[2] == "".
💾 NOM_Prenom_ex27.py
EX 28Je m'entraîne🌶️🌶️🌶️plusieurs étapes
Exercice 28 — Les filles et les maths : un tableur peine, Python non
Dans une table d'élèves, les options sont dans cinq colonnes (ligne[6:11]). Un tableur a du mal à compter « les élèves qui ont MATHEMATIQUES dans l'une des cinq colonnes ». Python, lui, sait : "MATHEMATIQUES" in ligne[6:11].
Écris une fonction part_filles(eleves, option) qui, pour les élèves présents de première et de terminale (classe qui commence par 1 ou T) suivant cette option, renvoie le nombre d'élèves et le pourcentage de filles (ligne[1] == "F").
Compare le pourcentage de filles parmi les élèves de première et de terminale, avec celui dans la spécialité MATHEMATIQUES, puis dans MATHS EXPERTES.
Teste aussi NUMERIQUE SC.INFORM., HUMAN.LITTER.PHILO. et PHYSIQUE-CHIMIE. Qu'observes-tu ? Que peut-on en conclure ?
Indice 1
Pour avoir la référence « toutes spécialités confondues », écris une version de la fonction sans le test d'option, ou teste option == "" pour tout accepter (au choix).
Indice 2
ligne[0][0] in "1T" est vrai si la classe commence par 1 ou par T.
💾 NOM_Prenom_ex28.py
ExercicesLes accidents : un gros fichier
EX 29Je m'entraîne🌶️🌶️application
Exercice 29 — Garçons, filles, âges
Securite_routiere2.csv contient 73 985 victimes de 2021 : une ligne = un sexe et un âge. Le fichier a deux lignes de titre : on les saute avec table[2:].
Combien de victimes de sexe G et de sexe F ? Compare avec ton résultat du tableur.
Quel est l'âge moyen des victimes garçons, puis filles ?
Quel est l'âge de la plus âgée victime du fichier ?
Indice 1
Pour l'âge moyen : une somme des âges et un compteur, séparés pour chaque sexe.
Indice 2
Pour le maximum : une variable maxi = 0 qui est remplacée quand on trouve un âge plus grand.
💾 NOM_Prenom_ex29.py
EX 30Je m'entraîne🌶️🌶️🌶️plusieurs étapes
Exercice 30 — Un histogramme en texte
Avec un dictionnaireeffectifs, compte les victimes de chaque âge. Puis affiche, par tranche de 10 ans (0 à 9 ans, 10 à 19 ans…), le nombre de victimes et une barre de # : un # par tranche de 500 victimes.
Quel âge compte le plus de victimes ?
Quelle tranche d'âge compte le plus de victimes ? Que penses-tu de la forme obtenue ?
Indice 1
age // 10 donne la tranche : 20 à 29 ans donnent 2.
Indice 2
Pour l'âge qui compte le plus de victimes : max(effectifs, key=effectifs.get) donne la clé de plus grande valeur.
Indice 3
"#" * 4 donne ####.
💾 NOM_Prenom_ex30.py
CoursCroiser deux tables
Deux tables peuvent se croiser quand elles ont un descripteur commun. Ici : l'âge. La pyramide des âges dit combien de personnes ont chaque âge ; le fichier des accidents dit combien de victimes ont chaque âge. En divisant, on obtient un taux : le nombre de victimes pour 100 000 personnes de cet âge. Un taux permet de comparer des groupes de tailles différentes.
Attention
Les victimes sont celles de 2021 ; la population est celle du 1er janvier 2023. Ce n'est pas la même année : les taux sont des ordres de grandeur, pas des mesures exactes.
EX 31Je m'entraîne🌶️🌶️🌶️🌶️défi
Exercice 31 — Le taux de victimes par âge
Construis, à partir de la pyramide, un dictionnaire population : la clé est l'âge, la valeur est le nombre de personnes (hommes + femmes). Avec effectifs (exercice 30), calcule pour chaque âge de 0 à 99 ans :
taux = 100000 * effectifs[age] / population[age]
À quel âge le taux est-il le plus élevé ? Quelle est sa valeur (arrondie à l'unité) ?
Affiche le taux à 10, 18, 30, 50, 70 et 90 ans. Que constates-tu ?
Compare le nombre de victimes à 70 ans et à 90 ans, puis le taux à ces âges. Pourquoi le taux est-il plus juste pour comparer ?
Calcule le taux global des garçons (victimes garçons ÷ population masculine × 100 000) et celui des filles. Quel est le rapport entre les deux ? Peut-on parler de « surmortalité masculine » ?
Indice 1
Pour la population : population[age] = int(ligne[2]) + int(ligne[3]). Pour « 100 ou plus », la clé 100 peut s'obtenir avec int(ligne[1].split()[0]).
Indice 2
Pour le taux par sexe, tu as besoin du nombre total de victimes garçons (exercice 29) et du total d'hommes (exercice 24).
💾 NOM_Prenom_ex31.py
ExercicesBilan
EX 32Je m'entraîne🌶️🌶️application
Exercice 32 — Tableur ou Python ?
Pour chaque situation, indique l'outil que tu choisirais (tableur ou Python) et pourquoi :
Regarder rapidement un petit fichier et en faire un graphique.
Refaire chaque année le même calcul sur un nouveau fichier de 500 000 lignes.
Compter les élèves qui ont une option dans l'une de cinq colonnes.
Montrer à un camarade, sans programmation, comment tu es arrivé à un résultat.
Indice
Pense à la rapidité de mise en œuvre, à la répétition du traitement, à la taille du fichier, à la lisibilité.