Aller au contenu

25 CSV

Fichier csv⚓︎

Un fichier CSV (en anglais, comma separated values) est le fichier de base des données recueillies, sans formatage particulier. Chaque champ (colonne) est séparé par une virgule. Puisque plusieurs applications utilisent des formats de fichier différents, les fichiers CSV servent de format universel permettant de voir vos données dans une variété d’applications, comme Microsoft Excel, LibreOffice Calc, Apple Numbers, le tableur Google, etc.

Soit le fichier employes.csv dont le contenu est le suivant :

📋 Texte
prénom,nom,département,mois de naissance
Jean,Valjean,comptabilité,novembre
Yves,Farge, ressources humaines,mars
Ada,Lovelace,informatique,décembre

Comme dans le chapitre sur les fichiers nous allons apprendre à importer ces données depuis un fichier .csv pour les exploiter, ou à écrire dans un fichier.
Pour manipuler ces données dans Python, on peut envisager de les stocker sous forme d'une liste de listes :

🐍 Script Python
[
['prénom', 'nom', 'département', 'mois de naissance'],
['Jean', 'Valjean', 'comptabilité', 'novembre'],
['Yves', 'Farge', 'ressources humaines', 'mars'],
['Ada', 'Lovelace', 'informatique', 'décembre']
]

Dans ce cas, si on considère ligne = liste[1], il faut clairement garder en tête à quel indice de la ligne correspond chaque donnée. Ici, il faut alors se souvenir que le prénom correspond à ligne[0], le nom à ligne[1], etc.

Une autre structure de données naturelle est d'utiliser une liste de dictionnaires.

🐍 Script Python
[
{'prénom': 'Jean', 'nom': 'Valjean', 'département': 'comptabilité', 'mois de naissance': 'novembre'}, 
{'prénom': 'Yves', 'nom': 'Farge', 'département': 'ressources humaines', 'mois de naissance': 'mars'}, 
{'prénom': 'Ada', 'nom': 'Lovelace', 'département': 'informatique', 'mois de naissance': 'décembre'}
]

On atteint alors les valeurs par leur clé : si on considère ligne = liste[0], le prénom du premier est ligne['prénom'].

Exemple de lecture avec la méthode .reader() du module csv⚓︎

🐍 Script Python
import csv

with open('employes.csv') as mon_fichier_csv:
    contenu_csv = csv.reader(mon_fichier_csv, delimiter=',')
    next(contenu_csv) # pour ne pas afficher la première ligne
    for row in contenu_csv:
        print(f'{row[0]} {row[1]} du département {row[2]} est né en {row[3]}')
📋 Texte
Jean Valjean du département comptabilité est né en novembre
Yves Farge du département  ressources humaines est né en mars
Ada Lovelace du département informatique est né en décembre
Alan Turing du département informatique est né en juin
Donald Knuth du département informatique est né en janvier

Attention, contenu_csv est alors de type _csv.reader
Comme lors de la lecture de fichier, la lecture des données du fichier fait avancer le pointeur de lecture. On ne pourrait pas, par exemple, refaire la même boucle 2 fois.

🐍 Script Python
with open('employes.csv') as mon_fichier_csv:
    contenu_csv = csv.reader(mon_fichier_csv, delimiter=',')
    next(contenu_csv) # pour ne pas afficher la première ligne
    print("tour 1")
    for row in contenu_csv:
        print(f'{row[0]} {row[1]} du département {row[2]} est né en {row[3]}')
    print("tour 2")
    for row in contenu_csv:
        print(f'{row[0]} {row[1]} du département {row[2]} est né en {row[3]}')    
donne :
📋 Texte
tour 1
Jean Valjean du département comptabilité est né en novembre
Yves Farge du département ressources humaines est né en mars
Ada Lovelace du département informatique est né en décembre
tour 2

De plus, cette variable de type csv_reader n'existe que tant que le fichier est ouvert.

🐍 Script Python
with open('employes.csv') as mon_fichier_csv:
    contenu_csv = csv.reader(mon_fichier_csv, delimiter=',')
    next(contenu_csv) # pour ne pas afficher la première ligne
for row in contenu_csv:
    print(f'{row[0]} {row[1]} du département {row[2]} est né en {row[3]}')
donne :
📋 Texte
Traceback (most recent call last):
  File "CoursCSV.py", line 44, in <module>
    for row in contenu_csv:
ValueError: I/O operation on closed file.

En utilisant une liste :⚓︎

On peut transformer directement le _csv.reader en list, et on pourra alors utiliser cette variable de type liste tout à fait normalement. Et celle-ci existe même après fermeture du fichier (mais elle prend de la place en mémoire, forcément).

🐍 Script Python
import csv

with open('employes.csv') as mon_fichier_csv:
    liste_csv = list(csv.reader(mon_fichier_csv, delimiter=','))
    print("tour 1")
    for row in liste_csv:
        print(f'{row[0]} {row[1]} du département {row[2]} est né en {row[3]}')
print("tour 1")
for row in liste_csv:
    print(f'{row[0]} {row[1]} du département {row[2]} est né en {row[3]}')
donne :
📋 Texte
tour 1
prénom nom du département département est né en mois de naissance
Jean Valjean du département comptabilité est né en novembre
Yves Farge du département ressources humaines est né en mars
Ada Lovelace du département informatique est né en décembre
tour 2
prénom nom du département département est né en mois de naissance
Jean Valjean du département comptabilité est né en novembre
Yves Farge du département ressources humaines est né en mars
Ada Lovelace du département informatique est né en décembre

Exemple de lecture avec la méthode .DictReader() du module csv⚓︎

🐍 Script Python
import csv

with open('employes.csv') as mon_fichier_csv:
    contenu_csv = csv.DictReader(mon_fichier_csv, delimiter=',')
    for row in contenu_csv:
        print(f'{row["prénom"]} {row["nom"]} du département {row["département"]} est né en {row["mois de naissance"]}')
📋 Texte
Jean Valjean du département comptabilité est né en novembre
Yves Farge du département  ressources humaines est né en mars
Ada Lovelace du département informatique est né en décembre
Alan Turing du département informatique est né en juin
Donald Knuth du département informatique est né en janvier

Attention, comme précédemment contenu_csv est alors de type csv.DictReader.

  • cette variable n'est pas accessible lorsque le fichier est fermé
  • il n'est pas possible de faire 2 boucles sur le même fichier de lecture
  • il est tout à fait possible de convertir directement ce fichier de lecture en liste. On aura alors une variable de type liste de dictionnaires, pleinement utilisable (mais qui prend de la place en mémoire).

Exemple de lecture avec la méthode .read_csv de la bibliothèque pandas⚓︎

🐍 Script Python
import pandas

contenu_csv = pandas.read_csv("employes.csv")

print(contenu_csv)
📋 Texte
   prénom       nom           département mois de naissance
0    Jean   Valjean          comptabilité          novembre
1    Yves     Farge   ressources humaines              mars
2     Ada  Lovelace          informatique          décembre
3    Alan    Turing          informatique              juin
4  Donald     Knuth          informatique           janvier

L'objet contenu_csv est de type pandas.core.frame.DataFrame sépcifique au module pandas.
Voir les détails de ce que l'on peut faire avec pandas dans la page dédiée : 22 - Pandas.md

Exemple d’écriture avec la méthode .writer() du module csv⚓︎

🐍 Script Python
import csv

ma_liste = [['prénom', 'nom', 'département', 'mois de naissance'],
            ['Jean', 'Valjean', 'comptabilité', 'novembre'],
            ['Yves', 'Farge', 'ressources humaines', 'mars'],
            ['Ada', 'Lovelace', 'informatique', 'décembre']]

with open('employes2.csv', 'w') as mon_fichier_csv:
    writer = csv.writer(mon_fichier_csv, delimiter=',')
    for employe in ma_liste:
        writer.writerow(employe)

Exemple d’écriture avec la méthode .DictWriter() du module csv⚓︎

🐍 Script Python
import csv

ma_liste = [{'prénom': 'Jean', 'nom': 'Valjean', 'département': 'comptabilité', 'mois de naissance': 'novembre'}, 
            {'prénom': 'Yves', 'nom': 'Farge', 'département': 'ressources humaines', 'mois de naissance': 'mars'}, 
            {'prénom': 'Ada', 'nom': 'Lovelace', 'département': 'informatique', 'mois de naissance': 'décembre'}]

with open('employes3.csv', 'w', newline='') as mon_fichier_csv:
    fieldnames = list(ma_liste[0].keys())
    writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
    writer.writeheader()
    for employe in ma_liste:
        writer.writerow(employe)

Exemple d’écriture avec la méthode .to_csv() de la bibliothèque pandas⚓︎

🐍 Script Python
import pandas

ma_liste = [["Alan","Turing","informatique","juin"],
            ["Donald","Knuth","informatique","janvier"]]

df = pandas.DataFrame(ma_liste, columns =["nom","prénom","département","mois de naissance"])

df.to_csv('employes.csv', mode='a', header=False, index=False)

Comment utiliser le module csv de Python⚓︎

  1. Afficher la liste des élèves (nom et prénom) contenus dans le fichier eleves.csv.
  2. Afficher la liste des élèves de Première A.
  3. Calculer la moyenne de la classe de Première A.
  4. AJouter des données :
    🐍 Script Python
    nouveaux_eleves = [["Dreyfus","Philippe","15","1A", "11"],
                       ["Hamilton","Margaret","16","1B", "15"]]
    

Solution avec le module csv⚓︎

  1. Afficher la liste des élèves :

    🐍 Script Python
    import csv
    
    with open("eleves.csv", "r") as f:
        donnees = csv.DictReader(f)
        for ligne in donnees:
            print(ligne["Nom"], ligne["Prénom"])
    

    📋 Texte
    Lovelace Ada
    Turing Alan
    Babbage Charles
    Shannon Claude
    Von Neumann John
    Knuth Donald
    Boole George
    Hopper Grace
    

  2. Afficher la liste des élèves de Première A :

    🐍 Script Python
    import csv
    
    with open("eleves.csv", "r") as f:
        donnees = csv.DictReader(f)
        for ligne in donnees:
            if ligne["Classe"] == "1A":
                print(ligne["Nom"], ligne["Prénom"])
    

    📋 Texte
    Lovelace Ada
    Babbage Charles
    Boole George
    Hopper Grace
    

  3. Calculer la moyenne de la Première A

    🐍 Script Python
    import csv
    
    with open("eleves.csv", "r") as f:
        donnees = csv.DictReader(f)
        somme_notes = 0
        nbre_eleves = 0
        for ligne in donnees:
            if ligne["Classe"] == "1A":
                somme_notes += float(ligne["Moyenne générale"])
                nbre_eleves += 1
        print(somme_notes / nbre_eleves)
    

    📋 Texte
    16.75
    

  4. Ajouter deux entrées avec le module csv :

    🐍 Script Python
    import csv
    
    nouveaux_eleves = [["Dreyfus","Philippe","15","1A", "11"],
                       ["Hamilton","Margaret","16","1B", "15"]]
    
    with open("eleves.csv", "a") as f:
        donnees = csv.writer(f)
        for entree in nouveaux_eleves:
            donnees.writerow(entree)
    

Bibliothèque pandas⚓︎

  1. Créer un DataFrame à partir du fichier eleves.csv.
  2. Afficher la liste de tous les élèves (nom et prénom) contenu dans le DataFrame.
  3. Afficher la liste des élèves de Première A.
  4. Calculer la moyenne de la classe de Première A.
  5. AJouter des données :
    🐍 Script Python
    nouveaux_eleves = [["Dreyfus","Philippe","15","1A", "11"],
                       ["Hamilton","Margaret","16","1B", "15"]]
    

Solution avec la bibliothèque pandas⚓︎

  1. Créer un DataFrame :

    🐍 Script Python
    import pandas
    
    donnees = pandas.read_csv("eleves.csv")
    

  2. Afficher la liste de tous les élèves :

    🐍 Script Python
    import pandas
    
    donnees = pandas.read_csv("eleves.csv")
    
    print(donnees[["Nom", "Prénom"]])
    

    📋 Texte
               Nom   Prénom
    0      Lovelace      Ada
    1      Turing     Alan
    2      Babbage  Charles
    3      Shannon   Claude
    4      Von Neumann     John
    5      Knuth   Donald
    6        Boole   George
    7       Hopper    Grace
    

  3. Afficher la liste des élèves de Première A:

    🐍 Script Python
    import pandas
    
    donnees = pandas.read_csv("eleves.csv")
    
    print(donnees[donnees["Classe"] == "1A"][["Nom", "Prénom"]])
    

    📋 Texte
            Nom   Prénom
    0  Lovelace      Ada
    2   Babbage  Charles
    6     Boole   George
    7    Hopper    Grace
    

    ou

🐍 Script Python
import pandas

donnees = pandas.read_csv("eleves.csv")

print(donnees.loc[donnees["Classe"] == "1A", ["Nom", "Prénom"]])

📋 Texte
        Nom   Prénom
0  Lovelace      Ada
2   Babbage  Charles
6     Boole   George
7    Hopper    Grace

  1. Calculer la moyenne de la classe de Première A:

    🐍 Script Python
    import pandas
    
    donnees = pandas.read_csv("eleves.csv")
    
    premiere_A = donnees[donnees["Classe"] == "1A"]["Moyenne générale"]
    
    print(premiere_A.mean())
    

    📋 Texte
    16.75
    

  2. Ajouter deux entrées avec le module pandas :

    🐍 Script Python
    import pandas
    
    donnees = pandas.read_csv("eleves.csv")
    
    nouveaux_eleves = [["Dreyfus","Philippe","15","1A", "11"],
                       ["Hamilton","Margaret","16","1B", "15"]]
    
    for entree in nouveaux_eleves:
        nouvelles_donnees = donnees.loc[len(donnees)] = entree
    
    donnees.to_csv("eleves2.csv")
    donnees.to_csv("eleves3.csv", index=False)
    

    ou
    🐍 Script Python
    import pandas
    
    nouveaux_eleves = [["Dreyfus","Philippe","15","1A", "11"],
                       ["Hamilton","Margaret","16","1B", "15"]]
    
    df = pandas.DataFrame(nouveaux_eleves, columns =["Nom","Prénom","Âge","Classe","Moyenne générale"])
    
    df.to_csv('eleves.csv', mode='a', header=False, index=False)