Lerne Coding
In Python CSV-Dateien erstellen und lesen
24.01.2020

In Python 3 mit CSV-Dateien arbeiten

Inhaltsverzeichnis
[[TABLE OF CONTENTS]]
access_timeGeschätzte Lesezeit ca. 10 Minuten

Du kannst in Python 3 über verschiedene Wege mit CSV arbeiten. Der Standard-Weg ist über das integrierte Modul "csv", das in der Standard-Library von Python 3 enthalten ist. Damit kannst du CSV-Dateien lesen und schreiben.

Als Alternative vor allem für Statistik und Auswertung (kz. Data Science) gibt es auch noch die Module "Numpy" und "Pandas". Diese eignen sich für das direkte Einlesen und Schreiben von CSV-Daten.

Da Python sich für Data-Science-Auswertungen von CSV-Dateien sehr gut eignet, kann ich euch, wenn ihr nach Daten für eine erste Analyse sucht um mit dem Thema einzusteigen, den Begriff Open Data empfehlen. Zum Beispiel findet ihr Daten der Deutschen Bundesregierung auf der Seite von https://www.govdata.de/.

Willst du doch lieber wissen, wie das mit CSV in PHP funktioniert? Dann schau dir doch den folgenden Artikel von mir an: CSV-Dateien ganz einfach mit PHP erstellen und lesen!

Was ist eine CSV-Datei?

CSV steht für comma-separated values oder auch für character-separated values. Letzteres finde ich persönlich passender, da auch andere Separatoren häufig Verwendung finden. Einen Standard gibt es dort nicht, jedes Programm behandelt CSV anders.

Eine CSV-Datei repräsentiert immer eine Tabelle; aus diesem Grund haben CSV-Dateien auch immer eine Kopfzeile mit der Bezeichnung der Spalte. Ein häufiger Verwendungszweck für CSV-Dateien ist der Export und Import von Daten in Tabellenkalkulationsanwendungen. Ein bekanntes Beispiel hierfür ist Excel. Ein anderer Anwendungsbereich ist zum Beispiel der Open-Data-Bereich, denn über CSV lassen sich alle möglichen Datensätze schnell für eine Zielgruppe zur Verfügung stellen. Eine Zeile ist dann zum Beispiel ein Monat bei der Aufzeichung des Wasserstandes des Rheins bei Düsseldorf.

Dieses Beispiel werden wir im weiteren Verlauf des Artikels zum Arbeiten nehmen, du kannst dir diese CSV auch downloaden - das geht auf dem Open-Data-Portal der Stadt Düsseldorf.

Link: https://opendata.duesseldorf.de/dataset/wasserstand-des-rheins-bei-düsseldorf

Eine CSV-Datei, die mittels Python erstellt wurde, kann zum Beispiel den folgenden Inhalt haben. Es beginnt immer mit dem Tabellenkopf; dort befinden sich die Spaltenbezeichnungen.

Datum,Höchster Wert,Niedrigster Wert,Durschnittlicher Wert,Valide,Nummer,Betrag
01.01.2019,510,220,365,True,,10
01.02.2019,610,320,465,False,30,20
03.02.2019,610,,465,True,,20

Sobald ein Komma in einem Feld ist, wird der ganze Wert von Python in Anführungszeichen gesetzt, damit die CSV weiterhin valide bleibt und korrekt eingelesen wird.

Eine CSV-Datei hat folgende wichtige Begriffe, ihr könnt diese aus der nachfolgenden Infografik entnehmen.

Infografik Python CSV
Infografik Python CSV

Erkennen von CSV-Dateien in Python, die "Dialekte" sprechen

Im vorangegangen Text habe ich bereits beschrieben, dass unterschiedliche Programme auf unterschiedliche Weise CSV-Dateien erstellen. Über die sogenannten "Dialekte", die man auswählen kann, ist es möglich, CSV-Dateien von verschieden Programmen zu lesen.

Die Standard-Bibliothek liefert zum Erkennen der verschiedenen "Standards" einen Sniffer. Mit dieser kann automatisiert das Format der CSV festgestellt werden.

import csv

example = open("example_csv.csv").read(1024)
dialect = csv.Sniffer().sniff(example)

Das "dialect"-Objekt können wir nachfolgend dafür verwenden, unsere CSV-Datei korrekt lesen zu können.

Dialekte selber im CSV-Modul von Python definieren

In Python ist es auch möglich, die Dialekte selber zu definieren und nicht automatisch aus einer Datei einlesen zu lassen.

Die Funktion csv.register_dialect hat folgende Standard-Parameter:

  • name - Der Name des Dialekts. Dieser ist wichtig, um ihn später abrufen zu können
  • dialect - Der Parameter ist nicht zwingend notwendig, kann aber angegeben werden. In ihn kann ein Objekt vom Sniffer direkt eingetragen werden, um diesen Dialekt zu registrieren.

Alternativ dazu, ein Dialekt-Objekt anzugeben, können auch die einzelnen Parameter eines Dialekt-Objekts übergeben werden. Die wichtigsten Parameter hierfür sind:

  • delimiter - Trenner zwischen zwei Spaltenwerten. Standardwert in Python ist das Komma.
  • quotechar - Dieses Zeichen dient dazu, Spaltenwerte zu maskieren; beispielsweise, falls Kommata oder weitere Sonderzeichen im Spaltenwert selbst sind. Standardwert ist das doppelte Anführungszeichen.

Für weitere Parameter kann ich dir diese Dokumentation empfehlen: Python Parameter

Nun können wir unseren eigenen "HelloCoding"-Dialekt definieren, was wenig Sinn macht, aber möglich ist. Das soll euch nur exemplarisch diese Funktion zeigen:

csv.register_dialect("hellocoding",delimiter="$",quotechar='"')

Dialekt-Aufrufliste in Python 3

Nach dem wir nun einen eigenen Dialekt definiert haben, können wir diesen auch ganz einfach mit der list_dialects()-Methode abrufen.

Mit folgendem Aufruf können wir uns die Dialekte im Terminal ausgeben lassen:

print(csv.list_dialects())

## Ausgabe ist: ['excel', 'excel-tab', 'unix', 'hellocoding']

CSV-Datei mit Python im CSV-Modul schreiben

Eine CSV-Datei in Python zu schreiben ist nicht wirklich schwer. Als erstes muss eine Liste mit weiteren Listen definiert werden. Diese repräsentieren später unsere Spalten.

Wir benötigen die Methode "writer" aus dem CSV-Modul, um unsere Zeilen zu schreiben.

# Schreiben einer CSV Datei Standardlib

import csv

toWrite = [
    ["Datum","Höchster Wert","Niedrigster Wert","Durschnittlicher Wert",Valide","Nummer","Betrag"],
    ["01.01.2019",510,220,365,True,'','10'],
    ["01.02.2019",610,320,465,False,'30','20'],
    ["03.02.2019",610,'',465,True,'','20']
]  

file = open('example_csv.csv', 'w') 

with file:
    writer = csv.writer(file)

    for row in toWrite:
        writer.writerow(row)

Unsere Variable "toWrite" enthält alle Zeilen. Diese können wir nun, nachdem wir unsere Datei geöffnet haben, hineinschreiben. In unserem Fall schreiben wir auch einen Tabellenkopf, weshalb uns egal ist, was bereits in der Datei enthalten ist. So können wir die CSV-Datei komplett überschreiben.

Falls du nur neue Werte hinzufügen (append) willst, kannst du bei der open-Funktion anstatt dem "w" ein "a" schreiben. So werden die Rows immer ans Ende hinzugefügt.

Lesen von CSV-Dateien in Python

Für das Lesen von CSV-Dateien habe ich eine kleine Funktion geschrieben. Diese prüft für euch zuerst, welcher Dialekt eingesetzt ist, wendet ihn und gibt euch dann die CSV zurück. Für unsere Funktion, die wir schreiben, benötigen wir den Sniffer aus einem der vorherigen Beispiele. Zusätzlich benötigen wir noch die Reader-Methode, um unser CSV mit dem Dialekt dann lesen zu können.

import csv

def csvReader(filename):
    context = open(filename).read(2048)
    dialect = csv.Sniffer().sniff(context)
    return csv.reader(open(filename),dialect)

for row in csvReader('example_csv.csv'):
    print(row)

Nun können wir über unsere erstellte Funktion, csvReader und einer Dateinamensangabe direkt über die Rows in der CSV iterieren und erhalten einzelne Listen.

Lesen von CSV-Dateien in Python mit NumPy

In Numpy gibt es ebenfalls eine einfache Funktion, mit der man CSV-Dateien öffnen kann. Diese Funktion nennt sich "genfromtxt" und eignet sich, um die CSV-Dateien direkt als numpy-Array zu importieren. Um die Pakete zu Installieren benötigst du PIP mehr dazu findest du im Artikel "Wie du PIP Installieren und Verwenden kannst?"

from numpy import genfromtxt

csvData = genfromtxt('example_csv.csv', delimiter=',')

Numpy-Array in CSV-Datei schreiben

Um einen Numpy-Array als CSV zu speichern, benötigen wir die Funktion "savetxt" und einen Numpy-Array zum Speichern. Des Weiteren müssen wir einen delimiter bestimmen.

import numpy

a = numpy.asarray([ [10,30,20], [56,1337,20], [20,20,20] ])
numpy.savetxt("example_csv.csv", a, delimiter=",")

Nach der Methode savetxt haben wir unseren Numpy-Array nun als CSV-Datei gespeichert.

Lesen von CSV-Dateien in Python mit Pandas

In Pandas haben wir eine Methode, die read_csv heißt und auch so einfach zu verstehen ist. Natürlich gibt es auch noch komplexere Optionen für Sonderfälle. Als Resultat der Funktion erhalten wir einen Pandas-DataFrame. Mit diesem können wir nun weiterarbeiten und unsere Daten auswerten.

import pandas as pd

df=pd.read_csv('example_csv.csv',index_col=False)
print(df)

In unserem Fall wollen wir keine Spalte als Index setzen und wollen deshalb einen zusätzlichen. Das heißt, wir müssen beim Importieren der CSV "index_col" auf False stellen.

Pandas-Data-Frame in CSV schreiben

Haben wir unseren Pandas-Data-Frame nun verändert und wollen diese CSV wieder speichern, ist das genauso einfach möglich, wie das Lesen der CSV.

Wichtig ist, dass wir den Index auf False stellen, wenn wir keinen zusätzlichen Index abspeichern wollen.

export_csv = df.to_csv ('export_dataframe.csv',index=False,header=True)

Fazit

Python stellt eine Vielzahl an Modulen für das Erstellen, Lesen, Schreiben und Verarbeiten von CSV-Dateien zur Verfügung. Mit den Modulen Numpy und Pandas sind deinen Datenanalysen und anderen Aufgaben keine Grenzen gesetzt.

Kommentare zum Artikel

Es sind noch keine Kommentare vorhanden? Sei der/die Erste und verfasse einen Kommentar zum Artikel "In Python CSV-Dateien erstellen und lesen "!

Kommentar schreiben

Vom Autor Empfohlen
close