Der letzte Artikel hat dir gezeigt, wie einfach es ist mit Python CSV Dateien einzulesen.
Dieses Mal soll es darum gehen die Daten wieder in eine Datei zu schreiben.
Zur Veranschaulichung machen wir direkt da weiter, wo der letzte Artikel aufgehört hat. Solltest du den also nicht gelesen haben, dann mach das bitte zuerst.
Dort bekommst du den nötigen Code, sowie die Dateien zum Download, um hier direkt mitarbeiten zu können.
Du weißt nicht, was du mit den Dateien machen sollst?
Hier findest du Hilfe.
Hier findest du auch ein Video zum Artikel:
Wie kann ich CSV Dateien schreiben?
Um CSV Dateien zu schreiben, musst du zuerst die Datei öffnen. Anschließend kannst du mit dem Modul ‘csv’ einen ‘writer’ erzeugen und Zeile für Zeile in die Datei schreiben. Mit ‘writerow’ schreibst du eine einzelne Zeile, ‘writerows’ schreibt dagegen eine Liste von Zeilen in einem Rutsch. Jede Zeile wird als Liste dargestellt, wobei jeder Eintrag in der Liste eine Zelle repräsentiert.
Aber alles nochmal langsam und Schritt für Schritt und erstmal der Code aus dem letzten Artikel.
import csv
import json
kontakte = {}
with open('/content/drive/MyDrive/posts/dateien/adressen/adressen.csv', 'r', encoding='utf-8') as csv_datei:
reader = csv.reader(csv_datei, delimiter=',')
kopfzeile = next(reader)
for zeile in reader:
eintrag = {}
for idx, spalte in enumerate(kopfzeile):
eintrag[spalte] = zeile[idx]
name = f'{zeile[0]} {zeile[1]}'
kontakte[name] = eintrag
print(kontakte)
json_text = json.dumps(kontakte, indent=4, ensure_ascii=False)
print(json_text)
Schritt 1: Datei öffnen
with open('/content/drive/MyDrive/posts/dateien/adressen/adressen_schreiben.csv', 'w', encoding='utf-8') as csv_schreib_datei:
Mit with open() öffnest du erstmal wieder die Datei und übergibst den Pfad. Als Operation nimmst du diesmal w für write / schreiben, um in die Datei reinschreiben zu können.
Am Ende kommt wieder ein Variablenname mit as, um das Datei-Handle nutzen zu können.
Da du bereits weißt, dass du Umlaute in deinen Daten hast, kannst du auch hier direkt wieder das encoding auf UTF-8 setzen.
Schritt 2: Trennzeichen definieren
import csv
with open('/content/drive/MyDrive/posts/dateien/adressen/adressen_schreiben.csv', 'w', encoding='utf-8') as csv_schreib_datei:
writer = csv.writer(csv_schreib_datei, delimiter=',')
Wie vorher auch schon der reader, benötigt auch der writer den Datei-Handle. Ohne den weiß er ja nicht, wohin die Daten geschrieben werden sollen, die du ihm später entgegenwirfst.
CSV steht für Comma separated value. Also für Komma separierte Werte. Demnach wird im Standard das Trennzeichen für die Zellen auch auf ein ‘,’ gesetzt. Wir könnten es uns hier also sparen. Trotzdem wollte ich dir zeigen, dass der Parameter existiert und du somit jedes beliebige Trennzeichen in deiner CSV verwenden kannst.
Schritt 3: Daten schreiben
import csv
with open('/content/drive/MyDrive/posts/dateien/adressen/adressen_schreiben.csv', 'w', encoding='utf-8') as csv_schreib_datei:
writer = csv.writer(csv_schreib_datei, delimiter=',')
writer.writerow(kopfzeile)
Da die Kopfzeile nur beschreibt, wie die Daten in der Datei zu interpretieren sind, hatten wir sie im letzten Artikel von den restlichen Daten getrennt.
Wie der Name sagt, ist es eine Kopfzeile und sollte somit natürlich auch am Anfang der Datei zu finden sein.
Du schreibst also als Erstes die Kopfzeile in die neue Datei rein.
Um eine einzelne Zeile zu schreiben, liefert dir der writer die Funktion writerow().
An writerow() kannst du eine Liste übergeben. Diese Liste wird dann als einzelne Zeile angesehen.
Das heißt, die einzelnen Elemente der Liste werden mit deinem angegebenen delimiter voneinander getrennt als eine Zeile in die Datei geschrieben.
Schritt 4: Daten zuordnen
Jetzt musst du dir deine Daten wieder zusammen sammeln. Wie oft in Python liegen die Daten schön sauber in einem Dictionary vor. Die Werte kannst du natürlich nicht einfach so in eine CSV Datei schreiben. Immerhin sind hier ja Zuordnungen vorhanden.
Es heißt also erstmal die Daten herauslösen und dann korrekt zur Kopfzeile zuordnen.
"Luitgard Hoffmann": {
"Vorname": "Luitgard",
"Nachname": "Hoffmann",
"Strasse": "Heckenweg 81",
"Postleitzahl": "54595",
"Ort": "Prüm",
"Telefon": "01776/115961",
"E-Mail": "luitgard.hoffmann64@gmx.de"
}
So sehen deine Daten aus. Du brauchst also erstmal nur den Wert aus dem Dictionary. Der Schlüssel interessiert dich ja nicht. Der war nur für Python hilfreich, um die Daten leicht aus dem Dictionary ziehen zu können.
Also erstmal die Daten von den Schlüsseln trennen. Das geht einfach mit der .values() Funktion:
print(kontakte.values())
Und über die Values – also die Werte – kannst du jetzt wieder iterieren. Iterieren heißt: Eine for-Schleife.
Also sieh dir erstmal an, was du dann mit jedem Durchlauf bekommst:
print(list(kontakte.values())[0])
Und dazu die Kopfzeile, die du schon hast:
print(kopfzeile)
Du hast also bei jedem Durchlauf wieder ein Dictionary in der Hand. Wobei die Schlüssel in dem Dictionary genau den Werten in deiner kopfzeile entsprechen.
Das ist doch super! Mit dem Schlüssel kannst du den entsprechenden Wert herausziehen und dir so Stück für Stück deine Zeile aufbauen:
import csv
with open('/content/drive/MyDrive/posts/dateien/adressen/adressen_schreiben.csv', 'w', encoding='utf-8') as csv_schreib_datei:
writer = csv.writer(csv_schreib_datei, delimiter=',')
writer.writerow(kopfzeile)
for eintrag in kontakte.values():
zeile = []
zeile.append(eintrag[kopfzeile[0]])
zeile.append(eintrag[kopfzeile[1]])
zeile.append(eintrag[kopfzeile[2]])
zeile.append(eintrag[kopfzeile[3]])
zeile.append(eintrag[kopfzeile[4]])
zeile.append(eintrag[kopfzeile[5]])
zeile.append(eintrag[kopfzeile[6]])
writer.writerow(zeile)
Und schon sind alle Daten Zeile für Zeile in die Datei geschrieben worden.
Ein Problem bleibt allerdings:
Wie beim letzten Mal schon funktioniert die Zuordnung so jetzt natürlich klasse für ein paar Spalten. Werden es aber 50, 100 und mehr Spalten, wird es schon schmerzhaft für jede Spalte eine eigene Zeile zu schreiben und die Zuordnung manuell zu machen.
Deswegen wollen wir auch hier automatisieren:
Schritt 5: Zuordnung automatisieren
Dieses Mal brauchst du auch gar kein enumerate()!
Du kannst einfach für jeden Eintrag in deinen Kontakten einmal die Kopfzeile durchlaufen. Jeder Eintrag in der Kopfzeile entspricht einem Schlüssel in deinen Kontakten.
Und mit einem Schlüssel kannst du direkt Daten aus einem Dictionary ziehen.
import csv
with open('/content/drive/MyDrive/posts/dateien/adressen/adressen_schreiben.csv', 'w', encoding='utf-8') as csv_schreib_datei:
writer = csv.writer(csv_schreib_datei, delimiter=',')
writer.writerow(kopfzeile)
for eintrag in kontakte.values():
zeile = []
for spalte in kopfzeile:
zeile.append(eintrag[spalte])
writer.writerow(zeile)
So einfach kann es gehen.
Schon hast du mit nur ein paar Zeilen Code dein Dictionary in eine Datei geschrieben. Mit Kopfzeile und deinem gewünschten Trennzeichen.
Einen Umbau können wir allerdings noch machen.
Mit dem csv Modul kannst du nicht nur einzelne Zeilen schreiben. Du kannst auch eine lange Liste mit Zeilen aufbauen und alle in einem Rutsch schreiben.
Um mehrere Zeilen auf einmal schreiben zu können bekommst du vom writer die Funktion writerows() zur Verfügung gestellt.
An writerows() übergibst du einfach eine Liste mit Listen.
Also eine lange Liste bei der jeder Eintrag eine weitere Liste ist. Und jede dieser Listen stellt eine Zeile dar.
Nach dem Umbau sollte es etwas klarer sein.
Dafür sammelst du einfach erstmal alle Zeilen, statt sie direkt in die Datei zu schreiben und schreibst sie dann am Ende:
import csv
with open('/content/drive/MyDrive/posts/dateien/adressen/adressen_schreiben.csv', 'w', encoding='utf-8') as csv_schreib_datei:
writer = csv.writer(csv_schreib_datei, delimiter=',')
writer.writerow(kopfzeile)
zeilen = []
for eintrag in kontakte.values():
zeile = []
for spalte in kopfzeile:
zeile.append(eintrag[spalte])
zeilen.append(zeile)
writer.writerows(zeilen)
Zusammenfassung
- Einlesen mit with open()
- Writer mit csv.writer() erzeugen
- Writer konfigurieren (Datei-Handle und Delimiter übergeben)
- Kopfzeile als Erstes schreiben
- Daten Zeile für Zeile mit writerow() in die Datei schreiben
- Optional: Daten in einer großen Liste sammeln und auf einen Schlag mit writerows() schreiben
Das war’s!
So einfach kannst du beliebige CSV Daten aus deinen Programmen in Dateien schreiben.
Kurse
Code Challenges und YouTube Videos führen nicht immer zum gewünschten Erfolg.
Manchmal ist es besser, gezielt und strukturiert durch ein Thema zu arbeiten.
Schau dich einfach mal bei meinen Kursen um.
Ohne lästiges Blah Blah steigen wir direkt in das Thema ein und behandeln alles, was du brauchst.
Ingo Janssen ist ein Softwareentwickler mit über 10 Jahren Erfahrung in der Leitung seines eigenen Unternehmens.
Er studierte Wirtschaftsinformatik an der TH Deggendorf und hat Softwareentwicklung an der FOM Hochschule in München unterrichtet.
Ingo hat mit einer Vielzahl von Unternehmen zusammengearbeitet, von kleinen und mittelständischen Unternehmen bis hin zu MDAX- und DAX-gelisteten Unternehmen.
Ingo ist leidenschaftlich daran interessiert, sein Wissen und seine Expertise mit anderen zu teilen. Aus diesem Grund betreibt er einen YouTube-Kanal mit Programmier-Tutorials und eine Discord-Community, in der Entwickler miteinander in Kontakt treten und voneinander lernen können.
Sie können Ingo auch auf LinkedIn, Xing und Gulp finden, wo er Updates über seine Arbeit teilt und Einblicke in die Tech-Branche gibt.
YouTube | Discord | LinkedIn | Xing | Gulp Profile