HOWTO · NumPy

Écrire NumPy Array en CSV en Python

Ce didacticiel montre comment enregistrer un tableau numpy dans un fichier csv

Sur cette page

Utilisez numpy.savetxt() pour écrire un tableau NumPy numérique sous forme de texte délimité par des virgules. Choisissez pandas si le tableau s’inscrit dans un traitement avec un DataFrame, ou csv.writer si vous devez créer ou personnaliser les lignes. Un fichier CSV stocke des lignes et des colonnes : avant l’enregistrement, déterminez comment un tableau à une dimension ou de dimension supérieure doit être réparti entre ces lignes.

Les exemples utilisent un petit tableau à deux dimensions composé de nombres entiers. Chacun écrit uniquement les valeurs, sans en-tête ni index. NumPy est nécessaire pour les exemples avec des tableaux ; pandas est un paquet supplémentaire, requis uniquement pour sa section. Les exemples et les libellés qu’ils affichent restent en anglais.

Choisir une méthode selon le tableau et le résultat souhaité

Pour un tableau numérique et un simple fichier texte délimité, numpy.savetxt() est un choix direct. Son paramètre delimiter définit le séparateur et fmt détermine la représentation de chaque valeur. Utilisez pandas si vous avez déjà besoin des opérations sur les DataFrames ou de noms de colonnes. Utilisez csv.writer si les lignes nécessitent un traitement personnalisé ou si vous avez besoin des règles de citation CSV de Python. Le module intégré gère les virgules et les guillemets dans les champs plus sûrement qu’une concaténation manuelle de chaînes.

Avec un tableau à une dimension, savetxt écrit les valeurs en colonne, à raison d’une valeur par ligne. Pour les écrire sur une seule ligne CSV, remodelez le tableau en (1, -1) avant l’enregistrement. La boucle csv.writer ci-dessous suppose un tableau à deux dimensions : chaque row parcourue est elle-même itérable. Avec une entrée à une dimension, utilisez writer.writerow(data) pour écrire une seule ligne, ou parcourez les valeurs et appelez writer.writerow([value]) pour écrire une valeur par ligne. Un fichier CSV ne représente pas directement trois dimensions. Remodelez un tableau 3D en lignes et colonnes, ou aplatissez-le en choisissant un ordre que le lecteur pourra reconstituer. Ne laissez pas l’aplatissement définir implicitement la disposition des données.

Enregistrer un tableau NumPy avec numpy.savetxt()

Le format '%d' convient aux nombres entiers présentés. Pour des nombres à virgule flottante, choisissez un format comme '%.3f' si trois chiffres après la virgule suffisent ; le formatage peut arrondir les valeurs, alors choisissez une précision adaptée aux données que vous devez préserver. Vous pouvez transmettre un autre séparateur, comme ';' ou '\t', à delimiter si l’outil destinataire l’exige.

Exécutez cet exemple :

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

from pathlib import Path
from tempfile import TemporaryDirectory
import numpy as np

data = np.array([[1, 2, 3], [4, 5, 6]])
with TemporaryDirectory() as directory:
    path = Path(directory) / "array.csv"
    np.savetxt(path, data, delimiter=",", fmt="%d")
    print(path.read_text(), end="")
1,2,3
4,5,6

Enregistrer un tableau NumPy avec pandas

Convertissez le tableau en DataFrame, puis appelez to_csv(). Par défaut, pandas écrit l’index du DataFrame et les noms de colonnes ; définissez index=False et header=False si le fichier doit contenir uniquement les valeurs du tableau. Conservez ces champs ou renseignez-les lorsqu’ils constituent des libellés utiles pour le destinataire.

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

from pathlib import Path
from tempfile import TemporaryDirectory
import numpy as np
import pandas as pd

data = np.array([[1, 2, 3], [4, 5, 6]])
with TemporaryDirectory() as directory:
    path = Path(directory) / "array.csv"
    pd.DataFrame(data).to_csv(path, index=False, header=False)
    print(path.read_text(), end="")
1,2,3
4,5,6

Écrire des lignes avec le module csv de Python

csv.writer écrit chaque ligne itérable et échappe les champs lorsque la syntaxe CSV l’exige. Ouvrez le fichier avec newline="" : le module CSV gère ainsi les caractères de nouvelle ligne et évite les lignes blanches supplémentaires sur les plateformes où la traduction des retours à la ligne peut en créer. L’exemple suivant utilise directement les lignes du tableau.

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

from pathlib import Path
from tempfile import TemporaryDirectory
import csv
import numpy as np

data = np.array([[1, 2, 3], [4, 5, 6]])
with TemporaryDirectory() as directory:
    path = Path(directory) / "array.csv"
    with path.open("w", newline="", encoding="utf-8") as file:
        writer = csv.writer(file)
        for row in data:
            writer.writerow(row)
    print(path.read_text(), end="")
1,2,3
4,5,6

Pour ajouter des lignes, ouvrez la destination en mode ajout ("a") et écrivez uniquement les nouvelles lignes. Vérifiez que leur ordre et leur nombre de colonnes correspondent à ceux du fichier existant ; le mode ajout ne les vérifie pas et n’ajoute pas d’en-tête. Pour une entrée à une dimension, déterminez si elle représente une seule ligne ou une valeur par ligne, puis remodelez-la ou enveloppez ses valeurs en conséquence.

Comprendre les limites de ndarray.tofile()

ndarray.tofile() est une méthode de tableau, mais ce n’est pas un outil d’écriture CSV. Elle écrit les éléments du tableau dans l’ordre aplati et ne conserve ni sa forme d’origine ni sa structure en lignes et colonnes. Un séparateur virgule permet de produire un texte délimité, mais le fichier ne renseigne toujours pas le lecteur sur les dimensions d’origine. La représentation produite dépend aussi du format choisi ; le fait que les données tiennent sur une seule ligne ne signifie pas, à lui seul, qu’elles ont perdu en précision numérique. Préférez savetxt, pandas ou csv.writer si vous avez besoin d’une disposition CSV explicite.

Écrire manuellement du texte CSV uniquement pour des données simples

Pour un petit tableau à deux dimensions connu, composé de valeurs numériques simples, le formatage de chaînes en Python permet de créer directement les lignes. Cette approche suppose que la forme et les valeurs conviennent à du texte brut. Construire le résultat complet avec join consomme une quantité de mémoire proportionnelle à la taille de la sortie, et la concaténation manuelle ne traite pas les virgules, les guillemets ou les retours à la ligne selon les règles CSV. Utilisez csv.writer pour les données générales ou les champs textuels.

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

from pathlib import Path
from tempfile import TemporaryDirectory

data = [[1, 2, 3], [4, 5, 6]]
with TemporaryDirectory() as directory:
    path = Path(directory) / "array.csv"
    content = "\n".join(",".join(str(value) for value in row) for row in data)
    path.write_text(content + "\n", encoding="utf-8")
    print(path.read_text(), end="")
1,2,3
4,5,6