Lire un fichier csv et liste de listes python☘
On va ouvrir ce fichier personnes.csv.
Le contenu du fichier.☘
Vous pouvez ouvrir le fichier personnes.csv avec un éditeur de texte ou un tableur pour visualiser son contenu. Le séparateur de données est la virgule.
Ce contenu est le suivant:
id_personne | nom | prenom | anneeNaissance |
---|---|---|---|
1 | Labrosse | Adam | 2000 |
2 | Gemlamorte | Adèle | 1985 |
3 | Auboisdormant | Abel | 2001 |
4 | Etpan | Ahmed | 1975 |
5 | Térieur | Alain | 1999 |
6 | Térieur | Alex | 1976 |
7 | Proviste | Alain | 2000 |
8 | Verse | Alain | 1970 |
9 | Ception | Alex | 2001 |
10 | Ainé | Ali | 1975 |
11 | Gator | Ali | 2001 |
12 | Bistraux | Alonzo | 2001 |
13 | Patamob | Alphonse | 1970 |
14 | Ficulté | Andy | 1980 |
15 | Rectdustade | Andy | 2000 |
16 | Verserre | Annie | 2001 |
17 | Boréal | Aurore | 1985 |
18 | Nor | Paul | 1985 |
19 | Dejeu | Bernadette | 2001 |
20 | Dajeun | Bruno | 1984 |
21 | Hiple | Candice | 2000 |
Important
La première ligne d'un tableau de données joue en général un rôle différent: ce n'est pas une donnée mais un texte décrivant les données. On parle de descripteur.
Les descripteurs dans le tableau ci-dessus ont pour nom: id_personne, nom, prenom, anneeNaissance.
En pratique, lorsqu'on manipule informatiquement un tel fichier de données, il ne faudra pas oublier d'appliquer aux descripteurs un traitement différent du traitement appliqué aux données.
Avec l'objet reader.☘
Le script "standard" pour la lecture (le fichier à lire est supposé ici être dans le même dossier que le fichier python):
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=',')
# lecture et affichage des lignes:
for ligne in lecture:
print(ligne)
Important
- Vous remarquerez que les éléments des listes-lignes sont des chaînes de caractère. Si l'on veut par exemple que l'année de naissance soit un entier, il vaudra utiliser
int
.
>>> annee = '2005'
>>> type(annee)
<class 'str'>
>>> annee = int(annee)
>>> annee
2005
>>> type(annee)
<class 'int'>
- Chaque ligne est une liste.
L'objet reader n'est pas une liste ou un tuple: il permet d'itérer sur les lignes du fichier mais on ne peut appeler par exemple lecture[2]
pour obtenir la ligne 3 du fichier, cela provoquerait une erreur: tout ce que l'on peut faire a priori est un parcours de lecture élément par élément (c'est à dire un parcours du fichier ligne par ligne).
En manipulant une liste de listes.☘
On peut toutefois transformer l'objet reader en liste:
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)
print(f"La ligne 0 du fichier: {lignes[0]}.")
print(f"La ligne 1 du fichier: {lignes[1]}.")
print(f"Le nombre de lignes du fichier: {len(lignes)}.")
Rappel
Avec une version de python <3.6, rappelons que les lignes d'appel à print
seront plutôt:
print("La ligne 0 du fichier: {}.".format(lignes[0]))
print("La ligne 1 du fichier: {}.".format(lignes[1]))
print("Le nombre de lignes du fichier: {}.".format(len(lignes)))
ou ici plus simplement:
print("La ligne 0 du fichier: ", lignes[0])
print("La ligne 1 du fichier: ", lignes[1])
print("Le nombre de lignes du fichier: ", len(lignes))
On obtient:
La ligne 0 du fichier: ['id_personne', 'nom', 'prenom', 'anneeNaissance'].
La ligne 1 du fichier: ['1', 'Labrosse', 'Adam', '2000'].
Le nombre de lignes du fichier: 22.
On remarquera que notre objet lignes
est maintenant une liste de listes.
Modifier le type de données lues☘
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.
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'é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☘
É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.
"""
Note
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
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☘
É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).
"""
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☘
Écrire une fonction qui crée la liste des personnes (nom et prénom) qui sont nées avant 2000.
Remarque
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☘
É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.
Solution
Un code 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'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())