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 :
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 :
[
['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.
[
{'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⚓︎
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]}')
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.
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]}')
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.
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]}')
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).
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]}')
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⚓︎
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"]}')
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⚓︎
import pandas
contenu_csv = pandas.read_csv("employes.csv")
print(contenu_csv)
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⚓︎
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⚓︎
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⚓︎
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⚓︎
- Afficher la liste des élèves (nom et prénom) contenus dans le fichier eleves.csv.
- Afficher la liste des élèves de Première A.
- Calculer la moyenne de la classe de Première A.
- AJouter des données :
🐍 Script Python
nouveaux_eleves = [["Dreyfus","Philippe","15","1A", "11"], ["Hamilton","Margaret","16","1B", "15"]]
Solution avec le module csv⚓︎
-
Afficher la liste des élèves :
🐍 Script Pythonimport csv with open("eleves.csv", "r") as f: donnees = csv.DictReader(f) for ligne in donnees: print(ligne["Nom"], ligne["Prénom"])
📋 TexteLovelace Ada Turing Alan Babbage Charles Shannon Claude Von Neumann John Knuth Donald Boole George Hopper Grace -
Afficher la liste des élèves de Première A :
🐍 Script Pythonimport 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"])
📋 TexteLovelace Ada Babbage Charles Boole George Hopper Grace -
Calculer la moyenne de la Première A
🐍 Script Pythonimport 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)
📋 Texte16.75 -
Ajouter deux entrées avec le module csv :
🐍 Script Pythonimport 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⚓︎
- Créer un DataFrame à partir du fichier
eleves.csv. - Afficher la liste de tous les élèves (nom et prénom) contenu dans le DataFrame.
- Afficher la liste des élèves de Première A.
- Calculer la moyenne de la classe de Première A.
- AJouter des données :
🐍 Script Python
nouveaux_eleves = [["Dreyfus","Philippe","15","1A", "11"], ["Hamilton","Margaret","16","1B", "15"]]
Solution avec la bibliothèque pandas⚓︎
-
Créer un DataFrame :
🐍 Script Pythonimport pandas donnees = pandas.read_csv("eleves.csv") -
Afficher la liste de tous les élèves :
🐍 Script Pythonimport pandas donnees = pandas.read_csv("eleves.csv") print(donnees[["Nom", "Prénom"]])
📋 TexteNom 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 -
Afficher la liste des élèves de Première A:
🐍 Script Pythonimport pandas donnees = pandas.read_csv("eleves.csv") print(donnees[donnees["Classe"] == "1A"][["Nom", "Prénom"]])
📋 TexteNom Prénom 0 Lovelace Ada 2 Babbage Charles 6 Boole George 7 Hopper Grace
ou
import pandas
donnees = pandas.read_csv("eleves.csv")
print(donnees.loc[donnees["Classe"] == "1A", ["Nom", "Prénom"]])
Nom Prénom
0 Lovelace Ada
2 Babbage Charles
6 Boole George
7 Hopper Grace
-
Calculer la moyenne de la classe de Première A:
🐍 Script Pythonimport pandas donnees = pandas.read_csv("eleves.csv") premiere_A = donnees[donnees["Classe"] == "1A"]["Moyenne générale"] print(premiere_A.mean())
📋 Texte16.75 -
Ajouter deux entrées avec le module pandas :
🐍 Script Pythonimport 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 Pythonimport 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)