Dateien lesen und schreiben
Overview
Teaching: 10 min
Exercises: 30 minQuestions
Wie können Dateien durch Python verarbeitet werden?
Objectives
Ein- und Auslesen von Dateien
Daten von der Festplatte laden und wieder speichern
Wenn wir unsere linguistische Forschung mit technischen Mitteln unterstützen wollen, kommen wir nicht umhin gespeicherte Sprachdaten zu laden und berechnete Auswertungen und/oder Aufbereitungen zu speichern. Unsere Berechnungen und Variablenbelegungen zur Laufzeit des Programmes sind im Hauptspeicher des Computers gespeichert. Dieser ist flüchtig. Persitenz bietet nur die Festplatte.
Lesen
Also, beginnen wir mit dem einfachen Laden. Hierfür benötigen wir open (schauen Sie für die Beschreibung der verwendeten Funktionen auch in die Python-Hilfe):
f1 = open('demofile.txt', 'r')
content1 = f1.read()
# ...
f2 = open('demofile.txt', 'r')
content2 = f2.readlines()
# ...
Frage(n)
- Was passiert in jeder Zeile des Programmes?
- Welchen Typ hat
fund welchen Typ hatcontent1bzw.content2?- Was fehlt noch? Warum ist das wichtig?
- Was ist der Unterschied zwischen
readundreadlines?Lösung
Die Funktion
openöffnet die Datei im Lesemodus ("r"als Wert für den Modus-Parameter) und liest dann den Inhalt mit den Methodenread()bzw.readlines()in Variablen.read()liest die gesamte Datei als einen String und liefert einen Wert vom Typstrzurück.readlines()liest die Datei zeilenweise und liefert eine Liste mit Strings zurück. Es fehlt noch das Schließen der Dateien mit der Methodeclose().f1.close()Das Schließen von Datein ist notwendig, wenn die gleiche Datei von mehreren Programmen oder Programmteilen genutzt werden soll. Insbesondere beim mischen von Lesen und Schreiben in Dateien kann es zu Problemen kommen, wenn gleichzeitig zwei Dateivariablen offen sind.
Schreiben
Wenn wir schreiben wollen, dann geht das so:
f = open('outfile.txt', 'w')
content = 'blablabla'
f.write(content)
f.close()
Frage(n)
Existiert
outfile.txtbereits? Was kann passieren, wenn wirfnicht schließen?Lösung
Die Datei muss nicht bereits existieren, das Programm wird die Datei neu anlegen und überschreiben. Wenn
fnicht geschlossen wird, wird zwar auch die Datei angelegt, aber es kann passieren, dass der Inhalt nicht oder nicht vollständig geschrieben wird.
Einen Datei manuell in allen möglichen Code-Pfaden zu schließen kann man oft vergessen, in Python gibt es daher einen speziellen with Block, der uns das vereinfacht:
with open("outfile.txt","a") as f
f.write("hello world!\n")
# wird nach diesem Block automatisch geschlossen
Tipps und Tricks
Wenn Sie vermeiden wollen, dass Sie eine Datei überschreiben, die es schon gibt, gibt es mehrere Mittel. Zum einen können Sie einen anderen Schreibmodus verwenden:
f = open('demofile.txt', 'x')
# ...
f.close()
Der Modus x schreibt in eine neue Datei. Existiert die Datei jedoch schon, wird ein sogenannter FileExistsError ausgegeben und das Programm beendet.
Das ist jedoch nicht die eleganteste Lösung. Solche Exceptions und Errors (mehr dazu in einer späteren Sitzung) sollten vermieden werden, wo es möglich ist.
Alternativ gibt es im Modul os (Submodul path) eine Funktion exists:
from os.path import exists
print(exists('demofile.txt'))
Übung
Wir wollen alle Nomen aus einer Geschichte und in eine Datei schreiben finden. Dafür brauchen wir
- eine Liste von Wörtern, die wir aus einem String (der Geschichte) generieren
- eine Definition von Nomen - wir gehen vereinfacht davon aus, dass alle großgeschriebenen Wörter außer am Satzanfang Nomen sind
Als Geschichte nehmen wir die Zusammenfassung des Inhalts von hier: http://de.wikipedia.org/wiki/Der_Hase_und_der_Igel
Lösung
# Unsere Funktion nimmt eine Liste als Parameter def find_nouns(list_of_words): nouns = list() # Das erste Wort ist wahrscheinlich großgeschrieben, fällt aber aus unserer Definition raus for i in range(1, len(list_of_words)): current_word = list_of_words[i] if current_word[0].isupper(): # list_of_words[i-1]: Das vorherige Wort if not list_of_words[i-1].endswith("."): nouns.append(current_word) return nouns with open("hase_igel.txt") as f: story = f.read() words = story.split() nouns = find_nouns(words) with open("hase_igel_nouns.txt", "w") as result: for noun in nouns: result.write(noun + ", ")
Kernpunkte
Mit den eingebauten Funktionen
openkönnen Dateien zum Lesen und Schreiben geöffnet werden, diese müssen immer wieder geschlossen werden.