Python #10: Dateiverarbeitung

In diesem Kapitel möchte ich beschreiben wie man Dateien mit Python verarbeiten kann. Bisher haben wir nur Variablen verwendet, diese verlieren jedoch ihre Gültigkeit beim Beenden oder beim Abbruch des Programmes und somit sind alle Daten verloren. Hier können wir nun eine Datei verwenden um diese Daten zu speichern.
Eine Datei kann uns später dazu dienen Daten abzulegen welche nach einem Beenden oder eines Abbruchs des Programmes erhalten bleiben sollen. 

Dateien öffnen

Um eine Datei zu öffnen, benötigen wir die Funktion „open(<<Dateiname>>,<<Modus>>)“

Dateiname

Der Dateiname ist der Name der Datei welche gelesen oder erstellt werden soll, sollte diese Datei nicht im gleichen Ordner liegen wie auch der Quellcode so muss der Pfad bis zu dieser Datei benannt werden.

Navigieren im Ordnerpfad

Sollte diese Datei nicht im selben Ordner liegen wie unser Quellcode so müssen wir eine Ebene nach oben navigieren, dieses machen wir in dem ein zwei Punkte und ein Backslash vor den Dateinamen gestellt wird. „..\“ 

Python - Dateiverarbeitung, Ordnerstruktur

Python – Dateiverarbeitung, Ordnerstruktur

Modus

Um zu steuern wie diese Datei behandelt werden soll, übergibt man der Funktion „open“ einen Modus. 
Mögliche Übergabewerte sind:

  • „r“ – (read) lesen der Datei
  • „w“ – (write) schreiben in der Datei
  • „a“ – (append) hinzufügen von Dateien an das Ende der Datei
  • „r+“ – spezieller Modus zum schreiben und lesen der Datei

lesen von Dateien

Fangen wir mit dem einfachen lesen einer Textdatei an. Unsere Beispieldatei enthält 3 Zeilen.

Zum lesen einer Datei benötigen wir die Funktion „open“ mit dem Modus „r“.

Die Ausgabe sieht dann wiefolgt aus:

Warum wird jeweils eine zusätzliche Leerzeile eingefügt?

Die Funktion „print“ gibt einen String aus und erzeugt am ende der Zeile einen Zeilenumbruch.
Jedoch haben wir in unserem Text am Zeilenende auch einen Zeilenumbruch. Dieses ist ein spezielles ASCII Zeichen welches nicht sichtbar ist. 

Nutzt man den Editor Notepad++, so kann man diese sichtbar machen.

Python - Dateiverarbeitung, anzeigen aller Zeichen
Python – Dateiverarbeitung, anzeigen aller Zeichen

Wir sehen also nun zwei Sonderzeichen, einmal „CR“ + „LF“. Das kürzel „CR“ steht für Carriage Return, und „LF“ steht für „Line feed“. Diese Bezeichnungen stammen noch aus der Zeit der Schreibmaschine und haben sich bis heute gehalten. 

Wir können diese Zeilen auch in den Text selber implementieren, dieses geschieht indem wir ein Backslash und ein „n“ für „NewLine“ einfügen „\n“.

Entfernen der unnötigen Zeile

Wie werden wir also nun die unnötige Leerzeile los? Hierzu nutzen wir die Funktion „strip()“ welche uns das String-Objekt mitliefert.

Die Funktion „strip“ entfernt alle unsichtbaren Zeichen am Anfang und am Ende einer Zeichenkette.

Original

Die Ausgabe:

Hier nun der Quellcode wie wir eine Zeile aus einer Datei lesen ohne die unsichtbaren Steuerzeichen:

Die Ausgabe ist nun:

Dateien schreiben

Wir haben zuerst die Datei zum lesen geöffnet, nun möchten wir diese zum schreiben öffnen.

Wenn die Datei nicht existiert so wird diese angelegt ansonsten wird diese für das schreiben geöffnet. Sobald diese Datei geöffnet wird (im Modus „schreiben“)  werden alle Daten innerhalb der Datei gelöscht und das ohne Rückfragen.

eine Liste in eine Datei schreiben

Nun wollen wir eine Liste mit Namen in die Datei schreiben. Das Thema Listen habe ich bereits im Kapitel Python #3: Listen behandelt, des Weiteren benötigen wir eine For Schleife. (Auch die Schleifen habe ich bereits behandelt siehe Python #7: Schleifen.)

Wir haben nun die Namen erfolgreich in die Datei „namen_storage.txt“ geschrieben. Jedoch werden diese in einer Zeile hintereinander weg in der ersten Zeile geschrieben.

Nun wollen wir jeden Namen in einer separaten Zeile schreiben. Dazu nutzen wir, das nicht sichtbare Steuerzeichen für einen Zeilenumbruch („\n“).

Die Ausgabe in der Datei ist nun:

hinzufügen von neuen Daten

Mit dem Modus „w“ überschreiben wir immer die Daten in der Datei. Wollen wir jedoch die alten Daten erhalten und „nur“ neue hinzufügen so müssen wir im Modus „a“ (dieses steht für append) arbeiten.

Nun schreiben wir immer wieder neue Zufallszahlen in die Datei „zufallszahlen.txt“.

Fehlerbehandlung

Wenn man eine Datei öffnet muss diese auch immer geschlossen werden, denn sonst werden die geschriebenen Daten nicht gespeichert.

Es erfolgt keine Ausgabe im zweiten Abschnitt des Quellcodes da im ersten Abschnitt das „close()“ vergessen wurde. (Ist auskommentiert.) 

Das Stück Quellcode ist noch sehr übersichtlich, bei größeren Skripten liegen meist zwischen diesen Abschnitten mehrere Zeilen.

Auch wird bei einem auftretenden Fehler die Funktion close nicht aufgerufen.

Dieser Quellcode erzeugt in der dritten Zeile einen Fehler, da nur Strings miteinander Konkatiniert werden kann.

Wie kann man sicherstellen das die Datei geschlossen wird?

Diese Frage ist wohl berechtigt denn ein Fehler kann immer auftreten ob nun von außen oder von innen.
Hier nutzen wir das Schlüsselwort „with“.

In dem Stück Quellcode provoziere ich den gleichen Fehler, jedoch wird in diesem Fall die Zeile „Hallo Welt!“ gespeichert.

Arbeiten mit CVS Dateien

Eine CSV Datei ist eine Textdatei in welche die Daten ähnlich wie eine Tabelle abgelegt werden können, d.h. man besitzt Zeilen und Spalten. Eine Spalte wird dabei durch einen Separator gekennzeichnet. Als Separator kann jedes beliebige Zeichen dienen, jedoch hat sich „eingebürgert“ das ein Semikolon genutzt wird.

Legen wir uns für das nächste Beispiel eine kleine Liste mit Name, Alter und Geschlecht an. Als Separator verwende ich ein Semikolon.

Man sieht, es kann Text und Zahl gemischt werden, jedoch ist es nicht von Vorteil den Separator im Text zu verwenden, denn an diesem Zeichen wollen wir später unseren String splitten.

Als Ausgabe erhalten wir dann:

Filtern 

In dem Kapiteln Python #6: Bedingte Anweisungen sowie Python #7: Schleifen habe ich die Befehle if, elif sowie continue vorgestellt welche wir nun nutzen möchten um die CSV Datei nach einem Wert zu filtern.

Nehmen wir an wir wollen alle männlichen Personen aus dieser Liste ausgegeben haben:

Die Ausgabe ist nun:

Möchte man jedoch nach dem Alter (also einer Zahl) filtern so muss man bedenken das alle Werte in der erzeugten Liste Strings sind.

Dieses erkennt man daran, das die Werte in Anführungszeichen gesetzt sind.

Also müssen wir den Wert erst in ein Zahl umwandeln.

Um dann diese Zahl auf den gewünschten Wert zu prüfen:

Nun geben wir nur die Personen aus bei welchen das alter größer als 48 Jahre ist.

Erstellen einer CSV Datei per Script

Nachdem wir mit einer bestehenden CSV Datei gearbeitet haben wollen wir uns eine solche Datei aus einer Mehrdimensionalen Lister erzeugen. Das Thema Listen habe ich bereits im Kapitel Python #3: Listen ausgiebig behandelt.

Im ersten Abschnitt habe ich eine Mehrdimensionale Liste mit 3 Personen erstellt. Um im zweiten Abschnitt diese Liste in eine CSV Datei zu speichern.
Ich habe die Werte in extra Variablen ausgelagert, dieses erhöht die Lesbarkeit des Quellcodes erheblich.

Man könnte jedoch auch schreiben:

Jedoch muss man den Wert für das Alter in ein String umwandeln, da die String-Konkatination nur ausschließlich mit Strings funktioniert.

Im dritten und letzten Abschnitt gebe ich diese Liste aus.

Die Ausgabe:

 

 

 

 

 

 

 

 

 

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.