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...

1
import csv
2
3
4
# ouverture en lecture du fichier csv
5
with open('personnes.csv', newline='') as fichier:
6
    # on crée un objet reader
7
    lecture = csv.reader(fichier, delimiter=',')
8
    # on transforme l'itérateur en liste:
9
    lignes = list(lecture)
10
11
12
# on transforme l'élément 0 et l'élément 3 de chaque liste-ligne en entier
13
# (attention, ne pas commencer à 0, la ligne 0 est celle d'entête):
14
for i in range(1, len(lignes)):
15
    lignes[i][0] = int(lignes[i][0])
16
    lignes[i][3] = int(lignes[i][3])
17
18
19
# quelques affichages:
20
for i in range(1,4):
21
    print(f"la ligne {i} du fichier: {lignes[i]}.")
22

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 :

1
def nombrePersonnePrenom(prenom):
2
        """
3
        prenom -- chaîne de caractères
4
5
        renvoie le nombre de personnes qui, dans le fichier personnes.csv,
6
        portent le prénom prenom.
7
        """

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 :

1
import csv
2
3
# ouverture en lecture du fichier csv
4
with open('personnes.csv', newline='') as fichier:
5
    # on crée un objet reader
6
    lecture = csv.reader(fichier, delimiter=',')
7
    # on transforme l'itérateur en liste:
8
    lignes = list(lecture)
9
10
def nombrePersonnePrenom(prenom):
11
    """
12
    prenom -- chaîne de caractères
13
14
    renvoie le nombre de personnes dans fichier.csv
15
    portant le prénom prenom
16
    """
17
    compteur = 0
18
    for ligne in lignes:
19
        if ligne[2] == prenom: compteur += 1
20
    return compteur
21
22
# test
23
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:

1
def listePrenomSansDoublon():
2
    """   
3
    renvoie la liste des prénoms de personnes.csv sans doublon
4
    (par exemple, le prénom Alain ne devra être  qu'une seule fois présent
5
    dans la liste résultat alors qu'il est présent plusieurs fois dans le fichier).
6
    """

Indice

On peut imaginer construire une liste de prenoms 'uniques'... Attention à exclure la ligne d'en-tête...

Solution

1
import csv
2
3
# ouverture en lecture du fichier csv
4
with open('personnes.csv', newline='') as fichier:
5
    # on crée un objet reader
6
    lecture = csv.reader(fichier, delimiter=',')
7
    # on transforme l'itérateur en liste:
8
    lignes = list(lecture)
9
10
def listePrenomSansDoublon():
11
    """   
12
    renvoie la liste des prénoms de personnes.csv sans doublon
13
    (par exemple, le prénom Alain n'est qu'une seule fois présent
14
    dans la liste résultat).
15
    """
16
    prenoms = []
17
    for i, ligne in enumerate(lignes):
18
        if ligne[2] not in prenoms and i > 0: #on élimine la ligne d'entête i=0
19
            prenoms.append(ligne[2])
20
    return prenoms
21
22
# affichage
23
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

1
import csv
2
3
# ouverture en lecture du fichier csv
4
with open('personnes.csv', newline='') as fichier:
5
    # on crée un objet reader
6
    lecture = csv.reader(fichier, delimiter=',')
7
    # on transforme l'itérateur en liste:
8
    lignes = list(lecture)
9
10
#on transforme l'année de naissance en entier (pour les comparer):
11
for i in range(1, len(lignes)):
12
    lignes[i][3] = int(lignes[i][3])
13
14
def listeAvant2000():
15
    """   
16
    renvoie la liste des couples (nom, prénom) de personnes.csv nées avant 2000.
17
    """
18
    personnesAv2000 = []
19
    for i, ligne in enumerate(lignes):
20
        if i > 0 and ligne[3] < 2000: #on élimine la ligne d'entête i=0
21
            personnesAv2000.append((ligne[1], ligne[2]))
22
    return personnesAv2000
23
24
# affichage
25
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

1
import csv
2
3
# ouverture en lecture du fichier csv
4
with open('personnes.csv', newline='') as fichier:
5
    # on crée un objet reader
6
    lecture = csv.reader(fichier, delimiter=',')
7
    # on transforme l'itérateur en liste:
8
    lignes = list(lecture)
9
10
#on transforme l'année de naissance en entier pour comparer:
11
for i in range(1, len(lignes)):
12
    lignes[i][3] = int(lignes[i][3])
13
14
def listeAlainApres1990():
15
    """   
16
    renvoie la liste des triplets (nom, prénom, date de naissance)  
17
    de personnes.csv nées 
18
    après 1990 et se nommant Alain.
19
    """
20
    personnes = []
21
    for i, ligne in enumerate(lignes):
22
        if i > 0 and ligne[3] > 1990 and ligne[2] == 'Alain':
23
            personnes.append((ligne[1], ligne[2], ligne[3]))
24
    return personnes 
25
26
# test
27
print(listeAlainApres1990())