Traitements des données d'un fichier CSV lors de la lecture
Modifier le type de données lues
Nous avons vu précédemment que les éléments des listes étaient tous des chaînes de caractères.
Question
Ouvrir et lire le fichier personnes.csv avec python, et transformer l'objet reader en liste de façon à ce que les attributs correspondants à l'identifiant (id_personne) et l'année de naissance ne soient plus des chaînes de caractères dans les listes obtenues mais soient des entiers.
Indice
Pour vous aider, on pourra transformer l'élément 0 et l'élément 3 de chaque liste-ligne en entier mais attention à ne pas commencer à 0, la ligne 0 est celle d'entête.
Solution
Une solution possible...
import csv
# ouverture en lecture du fichier csv
with open('personnes.csv', newline='') as fichier:
# on crée un objet reader
lecture = csv.reader(fichier, delimiter=',')
# on transforme l'itérateur en liste:
lignes = list(lecture)
# on transforme l'élément 0 et l'élément 3 de chaque liste-ligne en entier
# (attention, ne pas commencer à 0, la ligne 0 est celle d'entête):
for i in range(1, len(lignes)):
lignes[i][0] = int(lignes[i][0])
lignes[i][3] = int(lignes[i][3])
# quelques affichages:
for i in range(1,4):
print(f"la ligne {i} du fichier: {lignes[i]}.")
Compter des valeurs d'un champ
On souhaite compter le nombre de fois qu'une valeur d'un champ apparaît dans notre fichier CSV.
Question
Écrire un code possible pour la fonction python suivante :
def nombrePersonnePrenom(prenom):
"""
prenom -- chaîne de caractères
renvoie le nombre de personnes qui, dans le fichier personnes.csv,
portent le prénom prenom.
"""
Indice
Il faut bien entendu utiliser le fait que dans les listes-lignes obtenues par lecture du CSV, l'attribut "prénom" est celui d'indice 2.
Solution
Voici une solution possible en prenant l'exemple du prénom Alain :
import csv
# ouverture en lecture du fichier csv
with open('personnes.csv', newline='') as fichier:
# on crée un objet reader
lecture = csv.reader(fichier, delimiter=',')
# on transforme l'itérateur en liste:
lignes = list(lecture)
def nombrePersonnePrenom(prenom):
"""
prenom -- chaîne de caractères
renvoie le nombre de personnes dans fichier.csv
portant le prénom prenom
"""
compteur = 0
for ligne in lignes:
if ligne[2] == prenom: compteur += 1
return compteur
# test
print(nombrePersonnePrenom("Alain"))
Supprimer les répétitions
Lorsqu'on télécharge des fichiers CSV depuis le web, on se heurte souvent à des problèmes de qualité de la donnée. On souhaite à présent supprimer des doublons dans les enregistrements.
Question
Écrire un code possible pour la fonction python suivante:
def listePrenomSansDoublon():
"""
renvoie la liste des prénoms de personnes.csv sans doublon
(par exemple, le prénom Alain ne devra être qu'une seule fois présent
dans la liste résultat alors qu'il est présent plusieurs fois dans le fichier).
"""
Indice
On peut imaginer construire une liste de prenoms 'uniques'... Attention à exclure la ligne d'en-tête...
Solution
import csv
# ouverture en lecture du fichier csv
with open('personnes.csv', newline='') as fichier:
# on crée un objet reader
lecture = csv.reader(fichier, delimiter=',')
# on transforme l'itérateur en liste:
lignes = list(lecture)
def listePrenomSansDoublon():
"""
renvoie la liste des prénoms de personnes.csv sans doublon
(par exemple, le prénom Alain n'est qu'une seule fois présent
dans la liste résultat).
"""
prenoms = []
for i, ligne in enumerate(lignes):
if ligne[2] not in prenoms and i > 0: #on élimine la ligne d'entête i=0
prenoms.append(ligne[2])
return prenoms
# affichage
print(listePrenomSansDoublon())
Sélectionner suivant un critère
Avec Python, on peut aussi extraire des données qui répondent à un ou des critères.
Question
Écrire une fonction qui crée la liste des personnes (nom et prénom) qui sont nées avant 2000.
Indice
Pensez à transtyper la donnée correspondant à l'année en int
pour faire les tests de comparaison utiles sur cette donnée.
Solution
import csv
# ouverture en lecture du fichier csv
with open('personnes.csv', newline='') as fichier:
# on crée un objet reader
lecture = csv.reader(fichier, delimiter=',')
# on transforme l'itérateur en liste:
lignes = list(lecture)
#on transforme l'année de naissance en entier (pour les comparer):
for i in range(1, len(lignes)):
lignes[i][3] = int(lignes[i][3])
def listeAvant2000():
"""
renvoie la liste des couples (nom, prénom) de personnes.csv nées avant 2000.
"""
personnesAv2000 = []
for i, ligne in enumerate(lignes):
if i > 0 and ligne[3] < 2000: #on élimine la ligne d'entête i=0
personnesAv2000.append((ligne[1], ligne[2]))
return personnesAv2000
# affichage
print(listeAvant2000())
Sélectionner des lignes suivant plusieurs critères
Précédemment, nous avons vu une fonction qui permettait d'extraire des données suivant un critère, voyons à présent avec plusieurs critères...
Question
Écrire une fonction qui crée la liste des personnes (nom, prénom, date de naissance) qui sont nées après 1990 et qui s'appellent Alain.
Indice
Les opérateurs booléens seront nécessaires...
Solution
import csv
# ouverture en lecture du fichier csv
with open('personnes.csv', newline='') as fichier:
# on crée un objet reader
lecture = csv.reader(fichier, delimiter=',')
# on transforme l'itérateur en liste:
lignes = list(lecture)
#on transforme l'année de naissance en entier pour comparer:
for i in range(1, len(lignes)):
lignes[i][3] = int(lignes[i][3])
def listeAlainApres1990():
"""
renvoie la liste des triplets (nom, prénom, date de naissance)
de personnes.csv nées
après 1990 et se nommant Alain.
"""
personnes = []
for i, ligne in enumerate(lignes):
if i > 0 and ligne[3] > 1990 and ligne[2] == 'Alain':
personnes.append((ligne[1], ligne[2], ligne[3]))
return personnes
# test
print(listeAlainApres1990())