Aller au contenu

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())