HOWTO · Python

Écrire un tableau dans un fichier CSV en Python

Ce tutoriel montre comment enregistrer le tableau dans un fichier CSV en Python

Sur cette page

Le CSV (valeurs séparées par des virgules) stocke les données tabulaires sous forme de lignes de texte. Il est donc utile pour partager des tableaux traités avec des tableurs et d’autres programmes. Choisissez NumPy pour des données organisées en tableaux, Pandas si vous utilisez déjà un DataFrame, et le module csv de Python pour écrire des lignes de différents types de données avec une gestion fiable des guillemets. Les exemples ci-dessous utilisent la virgule comme séparateur et montrent comment lire les lignes obtenues.

Écrire un tableau NumPy dans un CSV avec numpy.savetxt()

numpy.savetxt() écrit dans un fichier texte les tableaux à une ou deux dimensions. Passez delimiter="," pour séparer les colonnes par des virgules ; le séparateur par défaut est une espace, qui ne produit pas de colonnes séparées par des virgules. Pour un tableau numérique à une dimension, utilisez np.savetxt("numbers.csv", data, delimiter=",", fmt="%d") si une représentation entière convient. Pour les valeurs décimales, choisissez un format tel que "%.2f" afin de contrôler la précision affichée.

Pour des données tabulaires mêlant texte et nombres, créez un tableau à deux dimensions, par exemple np.array([["Name", "Age"], ["Ada", 36]]), puis passez fmt="%s". Les tableaux NumPy n’acceptent qu’un seul type d’élément : lorsqu’on combine texte et nombres, les valeurs deviennent donc des chaînes de caractères, que ce format écrit sous forme de texte. Le CSV ne préserve pas les types Python ou NumPy. Le programme qui lit le fichier doit interpréter les valeurs telles que 36 s’il en a besoin sous forme d’entiers.

NumPy écrit chaque ligne du tableau comme une ligne du CSV. Il n’ajoute pas de noms de colonnes, sauf si vous fournissez un argument header ; par défaut, l’en-tête fourni est précédé d’un marqueur de commentaire. Pour obtenir une première ligne contenant simplement les noms de colonnes, définissez header="Name,Age" et comments="".

Écrire un tableau dans un CSV avec DataFrame.to_csv() de Pandas

Convertissez les données de type tableau en DataFrame Pandas si vous souhaitez nommer les colonnes ou si vous utilisez déjà Pandas. Par exemple, df = pd.DataFrame(data, columns=["Name", "Age"]) attribue des noms aux colonnes, et df.to_csv("people.csv", index=False) les écrit dans le fichier. L’option index=False empêche Pandas d’ajouter les étiquettes des lignes dans une première colonne supplémentaire ; omettez-la seulement si ces étiquettes doivent figurer dans le fichier. Définissez header=False si le fichier ne doit pas contenir les noms de colonnes. Consultez la référence de DataFrame.to_csv() pour découvrir les autres options d’exportation.

Écrire des lignes dans un CSV avec csv.writer() de Python

Le module csv.writer() de la bibliothèque standard de Python convient bien aux lignes qui contiennent du texte, des nombres, des virgules ou des guillemets. Ouvrez le fichier avec newline="", créez un objet writer et transmettez-lui les lignes avec writerows(). Le writer gère les guillemets CSV lorsqu’une valeur contient une virgule ou un guillemet. Cet exemple utilise uniquement la bibliothèque standard et affiche le contenu enregistré afin de rendre visibles le comportement des lignes et celui du séparateur :

Exécutez cet exemple :

Le code et les libellés ou sorties affichés dans cette section restent en anglais.

import csv
from pathlib import Path
from tempfile import TemporaryDirectory

rows = [[1, 4, 2], [7, 9, 4], [0, 6, 2]]
with TemporaryDirectory() as directory:
    path = Path(directory) / "numbers.csv"
    with path.open("w", newline="", encoding="utf-8") as file:
        writer = csv.writer(file)
        writer.writerows(rows)
    print(path.read_text(encoding="utf-8"), end="")
1,4,2
7,9,4
0,6,2

Pour les grands volumes de données, writerows() accepte un itérable de lignes ; il n’est donc pas nécessaire de rassembler tout le jeu de données dans une autre liste. Le fichier est fermé à la fin du bloc with.

Relire un fichier CSV avec csv.reader()

csv.reader() lit le fichier et fournit chaque ligne sous forme de liste de chaînes de caractères. Il s’agit d’un lecteur, pas d’un objet writer. Par exemple, une cellule écrite sous la forme 36 est relue comme la chaîne "36" ; convertissez-la avec int() ou float() si vous devez effectuer des opérations numériques. Pour lire un fichier CSV, ouvrez également le fichier texte avec newline="". Si le fichier comporte un en-tête, traitez sa première ligne séparément, par exemple en appelant next(reader) avant de traiter les lignes de données. Le lecteur interprète aussi les séparateurs placés entre guillemets, contrairement à un découpage de chaque ligne sur les virgules.

Écrire des lignes simples en manipulant directement un fichier

La manipulation directe d’un fichier convient aux valeurs simples et maîtrisées qui ne contiennent ni virgule, ni guillemet, ni saut de ligne. Convertissez chaque valeur en texte, joignez les valeurs d’une ligne avec des virgules et terminez-la par un saut de ligne ; par exemple, file.write(",".join(map(str, row)) + "\n"). Il s’agit d’un formatage manuel du texte, et non d’un sérialiseur CSV général : un nom tel que "Doe, Jane" serait réparti sur deux colonnes. Pour des données quelconques, utilisez csv.writer() afin de gérer correctement les guillemets et les séparateurs. Lorsque vous ouvrez un fichier pour écrire du CSV, utilisez newline="" et choisissez un encodage explicite, comme UTF-8, si le fichier contient des caractères non ASCII.