Introduction au module csv de Python
Le format CSV est l’un des plus simples et répandus pour stocker des données structurées et les échanger d’un logiciel à l’autre.
Python fournit un module intégré pour manipuler ce format : le bien nommé csv. Il permet de lire et d’écrire des fichiers CSV facilement, sans avoir besoin d’installer quoi que ce soit puisqu’il s’agit d'un module standard. Si les fichiers sont complexes il vaut mieux utiliser le module pandas, mais celui-ci n’est pas détaillé sur ce site.
Vous trouverez dans les exemples ci-dessous la syntaxe à utiliser. Seules les instructions les moins évidentes à comprendre seront expliquées.
Lecture
Examinons la lecture ligne par ligne puis avec dictionnaire.
Mais avant toute chose, il faut charger le module.
import csv
Le ligne à ligne est la méthode de base pour lire un fichier CSV.
Prenons par exemple le fichier chiens.cvs :
Race,Taille mini mâle,Taille maxi mâle,Taille mini femelle,Taille maxi femelle
Husky,54,60,51,56
Pointer,55,62,54,60
Dalmatien,56,61,54,59
with open('chiens.csv', newline='', encoding='utf-8') as fichier_csv:
lecteur = csv.reader(fichier_csv)
next(lecteur) # facultatif, pour sauter la première ligne
for ligne in lecteur:
print(ligne)
newline='' est une astuce pour éviter les problèmes de retour à la ligne, surtout sous Windows. encoding='utf-8' est une précision optionnelle mais recommandée pour éviter des soucis d’accents.
csv.reader est l’instruction qui transforme chaque ligne du fichier en liste Python.
Notez que le séparateur de notre fichier CSV est une virgule. Si nous avions des points-virgules (ce qui est habituel en France où la virgule est le séparateur décimal), il aurait fallu l’indiquer :
csv.reader(fichier_csv, delimiter=';')
La sortie est la suivante :
['Husky', '54', '60', '51', '56']
['Pointer', '55', '62', '54', '60']
['Dalmatien', '56', '61', '54', '59']
Il existe une méthode plus pratique. Chaque ligne est transformée en dictionnaire.
with open("chiens.csv", newline='', encoding='utf-8-sig') as fichier:
lecteur = csv.DictReader(fichier)
print("Tailles des races de chiens :")
for ligne in lecteur:
race = ligne['Race']
taille_male = f"{ligne['Taille mini mâle']}–{ligne['Taille maxi mâle']} cm"
taille_femelle = f"{ligne['Taille mini femelle']}–{ligne['Taille maxi femelle']} cm"
print(f"- {race} : mâle ({taille_male}), femelle ({taille_femelle})")
Note : le f placé avant les guillemets signifie qu'on utilise une f-string, c’est-à-dire une chaîne de caractères formatée. C’est une façon d'insérer des variables directement dans une chaîne de texte.
Autre remarque : le sig de encoding='utf-8-sig' permet d’éliminer le BOM (caractères de marquage situés en début de fichier CSV). Ajoutez-le si Python écrit \ufeffRace au lieu de Race.
Résultat :
Tailles des races de chiens :
- Husky : mâle (54–60 cm), femelle (51–56 cm)
- Pointer : mâle (55–62 cm), femelle (54–60 cm)
- Dalmatien : mâle (56–61 cm), femelle (54–59 cm)
Écriture
Nous n’étudierons pas comment créer un fichier CSV et le remplir avec Python. Ça ne présenterait pas une grande utilité pratique. En revanche, voyons comment ajouter une ligne au fichier d’origine.
Nous pouvons certes utiliser csv.writer mais passons directement à l’usage du dictionnaire.
# On précise les noms de colonnes (doivent correspondre à l'en-tête du fichier)
entetes = [
"Race",
"Taille mini mâle",
"Taille maxi mâle",
"Taille mini femelle",
"Taille maxi femelle"
]
# Ligne à ajouter
nouvelle_race = {
"Race": "Dogue de Bordeaux",
"Taille mini mâle": 60,
"Taille maxi mâle": 67,
"Taille mini femelle": 57,
"Taille maxi femelle": 65
}
# Ajout dans le fichier CSV
with open("chiens.csv", mode="a", newline='', encoding="utf-8-sig") as fichier:
writer = csv.DictWriter(fichier, fieldnames=entetes)
writer.writerow(nouvelle_race)
Si l’on relance le script précédent, on constate la présence d’une ligne supplémentaire :
- Dogue de Bordeaux : mâle (60–67 cm), femelle (57–65 cm)
Note : mode="a" signifie que nous sommes en mode ajout et que nous n’écrasons pas le fichier initial.
Données numériques
Il ne faut pas oublier que dans un fichier CSV, les nombres sont compris comme étant des chaînes de caractères. Pour procéder à des calculs avec des entiers ou des flottants, il faut les convertir selon les cas avec int ou float :
entier = int(ligne['entier'])
Lors de notre ajout des tailles de dogues de Bordeaux, nous n'avons pas inséré de guillemets. Cela n’a pas d’importance puisque le CSV n’enregistre que du texte. Il n’y a donc pas d’incohérence avec les données du fichier initial.
Pour une modification des données numériques, par exemple leur ajouter 1 :
for ligne in donnees:
ligne['entier'] = int(ligne['entier']) + 1