2.4. Le format CSV

La norme CSV (pour « comma-separated values ») est un format de fichier de texte fréquemment utilisé pour représenter des tableaux bi-dimensionnels. Un fichier CSV porte par convention l’extension .csv et débute par un en-tête constitué des noms de chacune de ses colonnes séparés par des virgules. Le reste du fichier comporte les lignes de valeurs qui peuplent ces colonnes.

À titre d’exemple, le fichier CSV contacts.csv ci-dessous contient une liste des prénoms, noms et adresses électroniques.

Prénom,Nom,E-mail
Alice,Martin,alice.martin@umicro.edu
Benjamin,Legrand,benjamin.legrand@umicro.edu
Camille,Dubois,camille.dubois@umicro.edu
David,Petit,david.petit@umicro.edu
Emma,Dupont,emma.dupont@umicro.edu

Note

Le CSV est un standard assez mal défini, ce qui a pour malheureuse conséquence que différents séparateurs sont utilisés pour délimiter les champs. Nous utiliserons la virgule, mais le point-virgule est un autre choix populaire. On trouve aussi parfois la tabulation comme séparateur, mais ce format porte généralement le nom de TSV pour « tab-separated values »).

Au cas où le symbole utilisé comme séparateur doit se trouver dans l’un des champs (dans un nombre à virgule par exemple), il faut alors délimiter ce champ par des guillemets doubles (") afin que le symbole ne soit pas interprété comme un séparateur.

2.4.1. Le module csv

La bibliothèque standard de Python contient un module nommé csv spécialisé dans le traitement de ce type de fichiers.

2.4.1.1. Écrire dans un fichier CSV

Avant de pouvoir écrire dans un fichier CSV, il est nécessaire de l’ouvrir comme n’importe quel autre ficher, comme nous n’avons vu précédemment. Il faut ensuite créer un objet écrivain sur le fichier file grâce à la fonction csv.writer(file). Un écrivain sert d’intermédiaire entre notre programme et le fichier, en transformant les instructions d’écritures pour qu’elles soient formatées selon la norme CSV. La principale méthode de l’objet écrivain est writerow(iterable), qui écrit dans le fichier une ligne contenant les valeurs de la collection donnée.

Écrivons un programme qui crée un fichier function.csv et y écrit deux colonnes, la première contenant les valeurs d’un paramètre \(x\) et la seconde les valeurs correspondantes transformées par la fonction mathématique \(f(x)\). Nous utiliserons les entiers de 0 à 9 comme valeurs de \(x\) et \(\sqrt{x}\) (arrondi à 4 décimales) comme fonction \(f(x)\).

import csv
import math


def f(x):
    return round(math.sqrt(x), 4)


# on ouvre le fichier en mode écriture
with open("function.csv", 'w', encoding="utf-8") as file:
    # on crée un objet écrivain sur ce fichier
    writer = csv.writer(file)
    # on écrit une ligne d'en-tête via l'écrivain
    writer.writerow(["x", "f(x)"])
    # finalement on écrit les lignes de données
    for n in range(10):
        writer.writerow([n, f(n)])

Le contenu du fichier function.csv ainsi généré est bien formaté selon la norme CSV.

x,f(x)
0,0.0
1,1.0
2,1.4142
3,1.7321
4,2.0
5,2.2361
6,2.4495
7,2.6458
8,2.8284
9,3.0

2.4.1.2. Lire un fichier CSV

La lecture se fait de manière semblable à l’écriture, si ce n’est qu’il faut créer un lecteur sur le fichier à la place de l’écrivain. Il est ensuite possible de parcourir le fichier ligne par ligne en itérant sur le lecteur à l’aide d’une boucle for. La variable d’itération contient alors une liste contenant chaque champ de la ligne, dans l’ordre.

import csv

# on ouvre le fichier en mode lecture
with open("function.csv", 'r', encoding="utf-8") as file:
    # on crée un lecteur sur ce fichier
    reader = csv.reader(file)
    # on itère sur le lecteur en affichant les valeurs de chaque ligne
    for row in reader:
        print(f"{row[0]} -> {row[1]}")

Le programme décode correctement le fichier CSV et affiche bien les valeurs attendues.

x -> f(x)
0 -> 0.0
1 -> 1.0
2 -> 1.4142
3 -> 1.7321
4 -> 2.0
5 -> 2.2361
6 -> 2.4495
7 -> 2.6458
8 -> 2.8284
9 -> 3.0

Note

Ce second programme ne fait que lire un fichier de sauvegarde qu’un autre programme a produit auparavant et aucun calcul n’y est effectué. Il s’agit dans cet exemple de calculs triviaux qui sont réalisés de manière (presque) instantanée sur un ordinateur moderne, mais cela démontre tout de même l’un des atouts de la sauvegarde de données dans les fichiers. En effet, générer ou transformer un jeu de données est parfois très coûteux et peut nécessiter des heures, voire des jours de temps de calcul. La sauvegarde permet donc de réutiliser les données produites sans avoir à effectuer à nouveau les opérations de calcul.