HOWTO · Python

CSV zu Array in Python lesen

In diesem Tutorial wird gezeigt, wie Sie in Python eine CSV-Datei in ein Array einlesen.

Auf dieser Seite

CSV-Dateien speichern tabellarische Datensätze als Zeilen mit durch Trennzeichen abgegrenzten Feldern. Um eine solche Datei in Python einzulesen, wählen Sie das Werkzeug passend zu den Daten und zur benötigten Struktur: NumPy für numerische Arrays, Pythons Standardbibliotheksmodul csv für Zeilen aus Zeichenketten oder pandas für Tabellen mit Beschriftungen. Für alle vier Beispiele liegen laut Paket erfolgreiche Laufzeitnachweise vor; jedes erstellt eine eigene temporäre CSV-Datei.

Numerische CSV-Daten mit numpy.loadtxt() einlesen

Verwenden Sie numpy.loadtxt(), wenn die Felder durchgehend numerisch sind und in einer regelmäßigen Tabelle angeordnet sind. Das Argument delimiter gibt das Trennzeichen im Eingabetext an. Es erscheint nicht im zurückgegebenen Array; Kommas werden zwischen den Werten ausgewertet. Standardmäßig ist delimiter ein Leerraumzeichen. Setzen Sie es für kommagetrennte Daten daher auf ein Komma. NumPy muss installiert sein, damit Sie dieses Beispiel ausführen können.

Führen Sie dieses Beispiel aus:

Der Code und die angezeigten Bezeichnungen oder Ausgaben in diesem Abschnitt bleiben auf Englisch.

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

with TemporaryDirectory() as directory:
    path = Path(directory) / "numbers.csv"
    path.write_text("1,2,3\n4,5,6\n7,8,9\n", encoding="utf-8")
    data_array = np.loadtxt(path, delimiter=",")
    print(data_array)

loadtxt() gibt für diese Eingabe mit mehreren Zeilen und Spalten ein zweidimensionales NumPy-Array zurück. Nutzen Sie dessen Array-Operationen für numerische Berechnungen. Wenn die Datei eine Kopfzeile enthält, überspringen oder verarbeiten Sie diese Zeile ausdrücklich, statt den numerischen Parser zu bitten, sie als Zahlen einzulesen.

CSV-Zeilen mit Pythons csv-Modul einlesen

Das Standardbibliotheksmodul csv.reader eignet sich für Felder, die Text enthalten oder unterschiedliche Werttypen haben. Es liefert für jede Zeile eine Liste aus Zeichenketten. Ein Aufruf des eingebauten list() verarbeitet den Reader vollständig und stellt alle Zeilen als Liste von Listen bereit. list() ist eine eingebaute Funktion und keine Methode; ihr Ergebnis ist kein NumPy-Array. Das ist nützlich, wenn Sie jedes Feld selbst untersuchen oder umwandeln möchten.

Der Code und die angezeigten Bezeichnungen oder Ausgaben in diesem Abschnitt bleiben auf Englisch.

from pathlib import Path
from tempfile import TemporaryDirectory
import csv

with TemporaryDirectory() as directory:
    path = Path(directory) / "people.csv"
    path.write_text(
        "Name,Age,Occupation\nJohn,28,Engineer\nJane,34,Doctor\n",
        encoding="utf-8",
    )
    with path.open(newline="", encoding="utf-8") as file:
        rows = list(csv.reader(file))
    print(rows)

Die Kopfzeile ist in der ersten Zeile enthalten, und Werte wie Altersangaben bleiben Zeichenketten, bis Sie sie umwandeln. Bei großen Dateien können Sie csv.reader zeilenweise durchlaufen, statt eine Liste mit dem gesamten Dateiinhalt zu erstellen. Wenn Sie die Datei mit newline="" öffnen, kann das CSV-Modul Zeilenenden korrekt verarbeiten.

CSV-Daten mit pandas einlesen

Wählen Sie pandas, wenn Spaltenbeschriftungen und tabellenorientierte Operationen hilfreich sind. Installieren Sie pandas, bevor Sie dieses Beispiel ausführen. pandas.read_csv() verwendet standardmäßig die erste Zeile als Spaltennamen und gibt einen beschrifteten DataFrame zurück. Wenn ein nachfolgender Verarbeitungsschritt ein Array benötigt, können Sie die Daten mit to_numpy() in ein solches umwandeln; der DataFrame selbst behält seine Zeilen- und Spaltenbeschriftungen.

Der Code und die angezeigten Bezeichnungen oder Ausgaben in diesem Abschnitt bleiben auf Englisch.

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

with TemporaryDirectory() as directory:
    path = Path(directory) / "people.csv"
    path.write_text(
        "Name,Age,Occupation\nJohn,28,Engineer\nJane,34,Doctor\n",
        encoding="utf-8",
    )
    frame = pd.read_csv(path)
    data_array = frame.to_numpy()
    print(data_array)

Pandas kann für verschiedene DataFrame-Spalten unterschiedliche Typen ableiten. Ein einzelnes NumPy-Array muss einen Datentyp haben. Daher kann die Umwandlung von Spalten mit gemischten Typen ein Objekt-Array oder einen anderen gemeinsamen Datentyp ergeben. Behalten Sie den DataFrame bei, wenn Beschriftungen und spaltenweise Operationen wichtig sind, und wandeln Sie ihn nur um, wenn der nächste Verarbeitungsschritt ein Array benötigt.

Fehlende numerische Werte mit numpy.genfromtxt() behandeln

Verwenden Sie bei numerischen Tabellen mit leeren Feldern numpy.genfromtxt() und wählen Sie einen Füllwert, der für die anschließende Berechnung geeignet ist. Hier kennzeichnet filling_values=np.nan einen fehlenden numerischen Wert mit NaN. Das Ergebnis verwendet Fließkommazahlen, damit es diesen Platzhalterwert darstellen kann. NumPy muss installiert sein.

Der Code und die angezeigten Bezeichnungen oder Ausgaben in diesem Abschnitt bleiben auf Englisch.

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

with TemporaryDirectory() as directory:
    path = Path(directory) / "measurements.csv"
    path.write_text("1,2,3\n4,,6\n7,8,\n", encoding="utf-8")
    data_array = np.genfromtxt(
        path, delimiter=",", filling_values=np.nan
    )
    print(data_array)

Die leeren Felder werden als NaN dargestellt. Sie können diese Werte mit NumPys isnan-Funktionen erkennen und sie behandeln, bevor Sie Berechnungen ausführen, die gewöhnliche Zahlen erfordern. genfromtxt() unterstützt auch eine umfangreichere Bereinigung der Eingabedaten. Geben Sie jedoch nur die Optionen an, die Ihre Datei benötigt, damit das Einleseverhalten nachvollziehbar bleibt.

Einen CSV-Reader passend zu Ihren Daten auswählen

  • Verwenden Sie numpy.loadtxt() für regelmäßig angeordnete numerische Felder, wenn Sie ein NumPy-Array als Ergebnis benötigen.
  • Verwenden Sie csv.reader, wenn Sie Zeilen aus Zeichenketten und Kontrolle über die Umwandlung der einzelnen Felder wünschen. Das Modul ist in Python enthalten.
  • Verwenden Sie pandas.read_csv() für Tabellen mit Beschriftungen und eine praktische spaltenbasierte Verarbeitung. Wandeln Sie die Daten nur dann in ein Array um, wenn es nötig ist.
  • Verwenden Sie numpy.genfromtxt() für numerische, durch Trennzeichen abgegrenzte Daten mit fehlenden Feldern, wenn sich ein gewählter Füllwert eignet.

Diese Werkzeuge geben nicht alle dieselbe Art von Objekt zurück. Entscheiden Sie, ob Sie Beschriftungen, Zeichenkettenfelder, numerische Array-Operationen oder eine ausdrückliche Behandlung fehlender Zahlen benötigen. Wählen Sie anschließend den Reader, der die gewünschte Struktur liefert.