Einführung in die Programmsprache Python - Dateien lesen oder schreiben - Programm Dies ist ein Text Dies ist ein Text Datei (File) Informationen werden in irgendeiner Form elektronisch abgelegt. ... ist eine Folge von Bytes, die verschiedene Informationen speichern. ... ist eine strukturierte Zusammenfassung von Daten. Die Dateiendung legt die Struktur fest. ... stellt Daten einem Rechnersystem oder Programm unter einem Namen zur Verfügung. Ein Name identifiziert eine Datei eindeutig. Einführung in Python, 07.07.09 Seite 2 Stream (Datenstrom) ... ist eine Folge von Zeichen von der Quelle zu einem logischen Gerät wie Monitor, Dateien, Drucker etc. stdin Eingehende Datenströme (downstream) Einführung in Python, 07.07.09 stdout Ausgehende Datenströme (upstream) Seite 3 Binäre Streams ... bestehen aus einer Folge von Bytes. Bytes stellen die Sprache der Computer dar. ... haben eine eindeutige Beziehung zu dem externen Gerät oder Datei. Die Anzahl der geschriebenen und / oder gelesenen Bytes entsprechen der Anzahl von Bytes auf dem externen Gerät. ... sind für Menschen nicht lesbar. ... sind meist sehr kompakte Dateien. ... werden im Rahmen dieses Kurses nicht behandelt. Einführung in Python, 07.07.09 Seite 4 Text-Streams ... bestehen aus einer Folge von Zeichen. Die Zeichen sind in Zeilen angeordnet. Eine Zeile endet mit einem Zeilen-Endezeichen (Newline; \n). Eine Zeile kann leer (Null) sein. Einige Zeichen werden für ein bestimmtes Gerät codiert. Zum Beispiel wird häufig [Newline] in ein [Carriage Return][Line Feed] übersetzt. ... sind für den Menschen in einem Editor lesbar. Einführung in Python, 07.07.09 Seite 5 Textdateien öffnen datei = open("klima.csv", "w") datei = open(pfad,"r") Seit Python 2.2 wird der Name der Methode open() als Alias für die Methode file() genutzt. Als Argument wird ... der Name der zu öffnenden Datei und ... ein Modus übergeben. Standardmäßig wird die angegebene Datei zum Lesen geöffnet. Einführung in Python, 07.07.09 Seite 6 Dateipfade Standardmäßig wird eine Datei im Programm-Verzeichnis gesucht. ... können absolut angegeben. Der Pfad wird vollständig ausgeschrieben. ... können relativ zum Ausgangspfad angegeben werden. Falls das Betriebssystem Windows genutzt wird, müssen Dateipfade als raw string ("Roher String") angegeben werden. Beispiel: pfad = r"C:\Dokumente und Einstellungen\OfficeTeam\ Eigene Dateien\python\kapitel6\datei.txt" Das Präfix r kennzeichnet einen raw String. Der Backslash wird als Zeichen und nicht als Steuerzeichen interpretiert. Einführung in Python, 07.07.09 Seite 7 Absolute Pfade Der Pfad wird von der Wurzel bis zur Datei beschrieben. Beispiel für Windows: C:\Dokumente\briefe\ brief0102.txt Beispiel für Linux / UNIX: /Dokumente/briefe/brief0102.txt C:\ Dokumente \python \briefe brief0102.txt brief0502.txt \planung Programme Einführung in Python, 07.07.09 Seite 8 Relative Pfade Der Pfad wird relativ zur Position des Programms beschrieben. Beispiel: [ briefe\brief0102.txt ] beschreibt den Pfad zu einer Textdatei in Abhängigkeit des Ordners Dokumente. Beispiel: [ ../python ] geht von dem Ordner briefe eine Ebene hoch und wechselt dort in den Ordner python. Einführung in Python, 07.07.09 C:\ Dokumente \python \briefe brief0102.txt brief0502.txt \planung Programme Seite 9 Modi zum Öffnen einer Datei Modi Beschreibung "r" Read. Die Datei wird zum Lesen geöffnet. Falls die Datei nicht vorhanden ist, wird ein Fehler gemeldet. "w" Write. Die Datei wird zum Schreiben geöffnet. Falls eine Datei mit dem Namen existiert, wird diese überschrieben. "a" Append. Die Datei wird zum Schreiben geöffnet. Eine Datei mit gleichen Namen wird nicht überschrieben. Die Daten werden angehängt. "r+", "w+", "a+" Die Datei wird zum Lesen und Schreiben geöffnet. Eine existierende Datei wird geleert. Einführung in Python, 07.07.09 Seite 10 Datei (File) - Objekt Informationen zur Datei werden als Objekt gespeichert. Das Objekt ist immer mit einer elektronischen Datei verbunden. Die Datei selber ... kann beliebig lang sein. ... hat ein definiertes Ende, welches mit eof (end of file) gekennzeichnet ist. ... besitzt einen Cursor, der auf ein Zeichen an einer bestimmten Position verweist. ' J Einführung in Python, 07.07.09 A N ' ••• \n ••• eof Seite 11 Attribute Eigenschaft Beschreibung datei.name datei.mode datei.encoding Dateiname. Modus der geöffneten Datei. Ist die Datei zum Schreiben oder Lesen geöffnet? Welcher Zeichencode wird in der Datei genutzt? datei.closed Ist die Datei geschlossen? Einführung in Python, 07.07.09 Seite 12 Zwischenspeicher nutzen datei = open("messung.dat", "r", buffering=11) ... Vor dem Schreiben oder nach dem Lesen werden die Daten aus der Datei in einem Zwischenspeicher abgelegt. Als drittes kann der Methode optional die Größe des Zwischenspeichers (Buffer) übergeben werden. Einführung in Python, 07.07.09 Seite 13 Mögliche Einstellungen datei = open("messung.dat", buffering=1) ... Wert = 0. Die Daten werden nicht im Zwischenspeicher abgelegt. Wert = 1. Die Daten werden zeilenweise aus der Datei in den Zwischenspeicher geschrieben. Wert > 1. Standardeinstellung. Es werden so viele Zeichen gelesen, wie im Zwischenspeicher abgelegt werden können. Einführung in Python, 07.07.09 Seite 14 Encoding der Datei datei = open("messung.dat", encoding="latin-1") ... Für jede zu öffnende Textdatei kann eine Codierung der Zeichen angegeben werden. Einführung in Python, 07.07.09 Seite 15 Strings kodieren >>> strText.encode("utf-8") b'5 kg Kartoffeln' Die Methode gibt ein Byte-Objekt zurück. Das Präfix b kennzeichnet ein Byte-Objekt. Eine Auflistung der möglichen Kodierungen finden Sie unter http://docs.python.org/library/codecs.html#standard-encodings. Einführung in Python, 07.07.09 Seite 16 ASCII-Zeichen American Standard Code for Information Interchange. Die Zeichen werden von 0 bis 127 durchnummeriert. Das heißt, jedes Zeichen wird mit einer Ganzzahl codiert. ... bestehen aus dem englischsprachigen Alphabet, den Zahlen, den Satzzeichen sowie Steuerzeichen. Ältere Versionen von Python nutzen eine ASCII-Codierung. Einführung in Python, 07.07.09 Seite 17 Unicode-Zeichen Unicode Transformation Format. Für jedes Zeichen auf der Welt wird eine eindeutige Nummer vergeben. Python 3.0 und höher nutzen standardmäßig eine UTF-8Codierung. Die verschiedenen Zeichen werden mit einer unterschiedlichen Anzahl an Bytes codiert. ASCII-Zeichen werden mit einem Byte codiert. Der erweiterte Latin-Zeichensatz wird mit zwei Bytes codiert. Unicode-Zeichenstrings sollten bei der Textbearbeitungen in Dateien genutzt werden. Einführung in Python, 07.07.09 Seite 18 Latin 1 oder iso-8859-1. 8-Bit-Zeichencode für Sprachen aus dem europäischen Sprachraum. Die ersten 128 Zeichen entsprechen dem ASCII-Code. ... codiert Buchstaben und Zahlen von 0 bis 255. Einführung in Python, 07.07.09 Seite 19 Codierung in der Python-Datei # -*- coding: iso-8859-1 -*- Ab Python 3.0 wird standardmäßig UTF-8 genutzt. Ältere Versionen nutzen ASCII. Am Anfang des Moduls kann eine Kommentarzeile mit der gewünschten Codierung gesetzt werden. Einführung in Python, 07.07.09 Seite 20 Datei schließen datei = open("messung.dat") ... datei.close() Nach dem Schließen der Datei ... ist ein Zugriff nicht mehr möglich. ... enthält die Variable einen ungültigen Verweis. Daten aus dem Zwischenspeicher werden in die zu schließende Datei übernommen. Einführung in Python, 07.07.09 Seite 21 Beispiel datei = open("messung.dat", encoding="latin-1") # Ist die Datei geöffnet... if not(datei.closed): ... datei.close() else: print("Die Datei ist nicht geöffnet.") Einführung in Python, 07.07.09 Seite 22 Cursorposition in einer Datei Datei (Zum Schreiben und / oder Lesen geöffnet) ' J A N ' ••• \n ••• eof Cursorposition nach dem Öffnen einer Datei mit dem Modus "r" und "w" Datei (Zum Hinzufügen geöffnet) ' J A N ' ••• \n ••• eof Cursorposition nach dem Öffnen einer Datei mit dem Modus "a" Einführung in Python, 07.07.09 Seite 23 Cursorposition lesen >>> datei.tell() 962 tell() gibt die aktuelle Cursorposition als Ganzzahl zurück. Falls UNIX-Zeilenumbrüche genutzt werden, kann das Programm unter Windows eine falsche Position zurückliefern. Einführung in Python, 07.07.09 Seite 24 Cursorposition setzen seek(pos, modus) setzt den Cursor eine bestimmte Anzahl von Bytes weiter. Der zweite Parameter gibt Auskunft darüber, wie der Cursor in Abhängigkeit der aktuellen Position gesetzt wird. In einer Textdatei wird der Cursor immer relativ zum Anfang der Datei gesetzt. Einführung in Python, 07.07.09 Seite 25 Beispiel anzahlZeichen = 2 pos = 0 messwert ='00' datei = open("messung.dat") while messwert != "": ... pos = pos + anzahlZeichen + 1 datei.seek(pos) datei.close() Einführung in Python, 07.07.09 Seite 26 Datei zeilenweise einlesen klima = {} datei = open("klima.csv", "r") for zeile in datei: zeile = zeile.strip() wort = zeile.split(" ") if not (wort[0] in klima): regen = float(wort[2]) temperatur = float(wort[1]) klima[wort[0]] = (temperatur, regen) datei.close() Einführung in Python, 07.07.09 Seite 27 Methoden zum Lesen einer Datei Methode Beschreibung read(bytes) Von der aktuellen Cursorposition werden n Bytes Zeichen gelesen. Falls die Klammer leer ist, wird die gesamte Datei eingelesen. Die gesamte Datei wird eingelesen. Es wird eine Liste mit allen Zeilen zurückgegeben. Ab der aktuellen Cursorposition wird die Zeile vollständig ausgelesen. Anschließend befindet sich der Cursor am Anfang der nächsten Zeile. readlines() readline() Einführung in Python, 07.07.09 Seite 28 n Zeichen einlesen anzahlZeichen = 2 pos = 0 messwert ='00' datei = open("messung.dat", encoding="latin-1") while messwert != "": messwert = datei.read(anzahlZeichen) pos = pos + anzahlZeichen + 1 datei.seek(pos) datei.close() Einführung in Python, 07.07.09 Seite 29 n Zeilen einlesen klima = {} datei = open("klima.csv", "r") zeile = datei.readline() # E(nd)O(f)F(ile) = leere Zeile while zeile != "": zeile = zeile.strip() wort = zeile.split(" ") if not (wort[0] in klima): regen = float(wort[2]) temperatur = float(wort[1]) klima[wort[0]] = (temperatur, regen) zeile = datei.readline() Einführung in Python, 07.07.09 Seite 30 Alle Zeilen einlesen allZeilen = () datei = open("tucholsky.txt") if not(datei.closed): allZeilen = datei.readlines() datei.close() Einführung in Python, 07.07.09 Seite 31 Fehler abfangen allZeilen = () datei = None try: datei = open("tucholsky.txt") allZeilen = datei.readlines() print(allZeilen) except (IOError, OSError) as ioErr: print(ioErr) finally: if datei is not None: datei.close() Einführung in Python, 07.07.09 Seite 32 In die Datei schreiben Methode Beschreibung write(text) ... schreibt einen String in die Datei. Es wird die Anzahl der geschriebenen Zeichen zurückgeliefert. Ab der aktuellen Cursorposition wird eine bestimmte Anzahl von Zeilen geschrieben. writelines(sequenz) Einführung in Python, 07.07.09 Seite 33 Zeilenweise Text in die Datei schreiben regen = [] monat = ("Januar", "Februar", "März", "April") ... dateiWrite = open("regen.csv", "w") zaehler = 0 for element in monat: strAusgabe = "{0}\t\tRegen: {1}\n" .format(element, str(regen[zaehler])) zaehler = zaehler + 1 dateiWrite.write(strAusgabe) dateiWrite.close() Einführung in Python, 07.07.09 Seite 34 Liste von Textzeilen in die Datei schreiben regen = [] ... dateiWrite = open("regenZeile.csv", "w") dateiWrite.writelines(regen) dateiWrite.close() Einführung in Python, 07.07.09 Seite 35 Das Modul sys ... bietet Attribute, die Informationen über das Laufzeitsystem enthalten. ... bietet eine Schnittstelle zwischen dem PythonInterpreter und dem Laufzeitsystem an. ... definiert folgende Schnittstellen: sys.stdin für die Standardeingabe (Tastatur). sys.stdout für die Standardausgabe (Bildschirm). sys.stderr für die Standardfehlerausgabe (Bildschirm). Einführung in Python, 07.07.09 Seite 36 Informationen zur Laufzeitumgebung >>> import sys >>> print("Plattform: ", sys.platform) Plattform: win32 >>> print("Python-Version: ", sys.version) Python-Version: 3.0.1 ( r301:69561, Feb 13 2009, 20:04:18) [MSC v.1500 32 bit (Intel)] >>> print("Bezeichnung: ", sys.version_info) Spezifikation der Version: (3, 0, 1, 'final', 0) Einführung in Python, 07.07.09 Seite 37 In welchen Ordnern werden Module gesucht? Das Modul sys enthält Informationen zu der Laufzeitumgebung von Python bereit. Die Methode sys.path liefert eine Liste mit allen Pfaden zurück, die Python nach Dateien durchsucht. Mit Hilfe von sys.path.append("Pfad") wird ein Pfad für die Dauer einer Sitzung eingebunden. Einführung in Python, 07.07.09 Seite 38 Programm beenden while zeichen != 'q': if not(zeichen.isalpha()): messwert.append(float(zeichen)) else: sys.exit("Falsche Eingabe") Der Funktion wird die Fehlermeldung übergeben. Einführung in Python, 07.07.09 Seite 39 Das Modul os ... ist eine Schnittstelle zum Betriebssystem. ... kontrolliert und verwaltet Daten, Arbeitsspeicher, Prozessor etc. ... bietet Methoden für ... das Anlegen neuer Dateien und Verzeichnisse. ... das Löschen von Dateien und Verzeichnissen (Ordner). ... das Suchen nach Dateien und Verzeichnissen (Ordner). ... das Abfragen von Attributen (Datum des Zugriffs etc.) von Dateien und Verzeichnissen. Einführung in Python, 07.07.09 Seite 40 Attribute für alle Betriebssysteme name: Kürzel für das verwendete Betriebssystem. curdir gibt das aktuelle Verzeichnis (Windows ".") zurück. pardir gibt das Elternverzeichnis (Windows "..") zurück. defpath gibt den Ordner zurück, in dem ausführbare Dateien gesucht werden. sep gibt den Separator zwischen den verschiedenen Bestandteilen eines Pfades zurück. extsep gibt das Trennzeichen zwischen Dateinamen und Dateiendung zurück. pathsep gibt das Trennzeichen zurück, welches die verschiedenen Elemente in der Systemvariablen PATH trennt. linesep gibt mögliche Zeichen für den Zeilenumbruch zurück. Einführung in Python, 07.07.09 Seite 41 Arbeitsverzeichnis anzeigen und ändern # Pfad ändern >>> os.chdir( "C:\Dokumente und Einstellungen\ Eigene Dateien\python") # Pfad anzeigen >>> pfad = os.getcwd() >>> pfad.split(os.sep) ['C:', 'Dokumente und Einstellungen', 'Eigene Dateien', 'python'] # Elemente im Arbeitsverzeichnis >>> os.listdir(pfad) ['klima.csv', 'klimaZeileRead.py'] Einführung in Python, 07.07.09 Seite 42 Arbeiten mit Ordnern (Verzeichnis) mkdir(pfad) erzeugt ein Verzeichnis im angegebenen Pfad. makedirs(pfad) erzeugt ein neues Verzeichnis und alle nicht vorhandenen Verzeichnisse, die im Pfad angegeben sind. rmdir(pfad) löscht das leere Verzeichnis. removedirs(pfad) löscht alle leeren Verzeichnisse, die in der Pfadangabe vorhanden sind. Mit Hilfe von path.exists(pfad) kann überprüft werden, ob ein Pfad vorhanden ist oder nicht. Einführung in Python, 07.07.09 Seite 43 Arbeiten mit Dateien remove(pfad) löscht die Datei. rename[old, new] benennt Dateien und Verzeichnisse um. renames[old, new] benennt Dateien und Verzeichnisse um. Verzeichnisse, die im Pfad vorkommen und nicht vorhanden sind, werden angelegt. Einführung in Python, 07.07.09 Seite 44 Reguläre Ausdrücke ... filtern Text nach bestimmten Mustern. ... suchen und ersetzen Text mit Hilfe von bestimmten Suchmustern. ... überprüfen einen Text auf seine Gültigkeit. ... entsprechen den Textausdrücken: Suche die Zeichenfolge abc am Anfang des Textes. Gebe alle Wörter zurück, die dem Muster 123 entsprechen. ... benötigen das Modul re. Das Modul ist in der Standardinstallation von Python vorhanden. Das Modul wird auf der Webseite http://docs.python.org/3.1/library/re.html#module-re beschrieben. Einführung in Python, 07.07.09 Seite 45 Suchmuster nutzen Suchmuster Erläuterung / Beispiele "Meier" "Me.er" "Meier" "Meier", "Meyer", "Me3er" Punkt: beliebiges Zeichen "Fisch?" "Fisch", "Fische" Fragezeichen: Ein Zeichen oder keins "M[a-e]ier" "Maier", "Meyer", "Meder" [a-e]: Alle Buchstaben von a bis e "M[a-e]ier" "Maier", "Meyer", "Meder" [a-e]: Alle Buchstaben von a bis e "Me[iy]er" "Meyer", "Meier" [iy]: Nur die angegebenen Zeichen "[a-zA-Z][a-zA-Z]-30159" Klein- und Großbuchstaben zulassen Einführung in Python, 07.07.09 Seite 46 Wiederholungen und Platzhalter Suchmuster Erläuterung / Beispiele "123-[0-1]*" "123-00", "123-1", "123-" Sternchen: Keine oder eine beliebige Anzahl von Wiederholung "123-00", "123-1" Sternchen: Mindestens einmal wird das Zeichen gesetzt \w: Klein- oder Großbuchstaben, Zahlen und der Unterstrich \d:Zahlen von 0 bis 9 Sonderzeichen wie Punkt etc. werden durch den Backslash maskiert "123-[0-1]+" "\w\w-\d\d\d\d\d" "\w\w\.\d\d" Einführung in Python, 07.07.09 Seite 47 Muster für E-Mail-Adressen '\w+@\w*\.?uni-hannover\.de' \w ist ein Platzhalter für Klein- und Großbuchstaben von A bis Z sowie der Unterstrich. Das Pluszeichen ersetzt eine beliebige Anzahl von Zeichen. Es muss mindestens ein Zeichen gesetzt sein. Das Sternchen ersetzt auch eine beliebige Anzahl von Zeichen. Die Zeichen können weggelassen werden. \. maskiert den Punkt. ? bezieht sich auf das vorherige maskierte Zeichen. Der Punkt kann einmal vorkommen, muss aber nicht. Einführung in Python, 07.07.09 Seite 48 Muster für Postleitzahlen 'D-(?=\d{5})' Die Postleitzahl beginnt mit dem Länderkürzel D-. ?= bedeutet "wird gefolgt von..." Dem Länderkürzel folgt eine Zahl (\d). Diese Zahl wird 5-mal {5} wiederholt. Durch die runden Klammern wird die Postleitzahl als Gruppe zusammengefasst. Einführung in Python, 07.07.09 Seite 49 Texte suchen 'Fähre|Boot|Segelschiff' (Kreuzfahrts|Segel)schiff|Fähre|Boot Mit Hilfe des geraden Strichs wird ein Oder zwischen die Begriffe gesetzt. Einführung in Python, 07.07.09 Seite 50 Arbeiten mit regulären Ausdrücken Voraussetzung: Import des Moduls re mit Hilfe der Anweisung import re. Kompilieren des Suchstrings: pattern = re.compile("muster") Suchen des Musters: treffer = pattern.search("text") Ausgabe oder Weiterverarbeitung der Treffer-Liste. Einführung in Python, 07.07.09 Seite 51 Muster kompilieren import re ort = "Hannover" anschrift = "D-30159 Hannover" pattern = re.compile('D-\d\d\d\d\d') Das Modul re wird importiert. Mit Hilfe der Methode compile wird ein regulärer Ausdruck erzeugt. Der Methode wird als Parameter ... das Suchmuster als String übergeben. ... optional IGNORECASE übergeben. Die Groß- und Kleinschreibung des Wortes wird nicht beachtet. Einführung in Python, 07.07.09 Seite 52 Muster suchen import re anschrift = "D-30159 Hannover" patternPLZ = re.compile('D-\d\d\d\d\d') matchFound = patternPLZ.search(anschrift) Mit Hilfe der Methode search wird ein Wort nach dem Muster durchsucht. Der Methode wird der zu durchsuchende Text übergeben. Die Methode gibt den ersten Treffer als Match-Objekt zurück. Falls das Suchmuster nicht gefunden wird, wird None zurückgegeben. Einführung in Python, 07.07.09 Seite 53 Muster am Anfang eines Strings suchen import re patternPLZ = re.compile('d{5}') if patternPLZ.match(anschrift): ort = patternPLZ.sub("", anschrift) print("Match:", ort) else: print("Match:", "Nicht vorhanden") Mit Hilfe der Methode match wird ein Wort nach dem Muster durchsucht. Falls das Muster am Anfang vorhanden ist, wird ein MatchObjekt geliefert und andernfalls None. Einführung in Python, 07.07.09 Seite 54 Informationen zu den Fundstellen found = patternPLZ.search(anschrift) while found is not None: # Beginn der Fundstelle print("Start: ", found.start()) # Ende der Fundstelle print("Ende: ", found.end()) # Was wurde gefunden? print("Gefunden; ", found.group(1)) # Teilstrings der Fundstelle von 0 bis n pos = found.start() + len(found.group()) found = patternPLZ.search(anschrift, pos) Einführung in Python, 07.07.09 Seite 55 Alle Textstellen in eine Liste schreiben patternMail = re.compile('\w+@\w*\.? uni-hannover\.de') adressen = "[email protected], [email protected]" allEMail = () allEMail = patternMail.findall(adressen) Die Methode findall gibt eine Liste mit allen Fundstellen zurück. Der Methode wird der zu durchsuchende Text übergeben. Einführung in Python, 07.07.09 Seite 56 Muster suchen und ersetzen import re if patternPLZ.match(anschrift): ort = patternPLZ.sub("", anschrift) print(ort) Die Methode sub ersetzt das Suchmuster in einem Text durch einen anderen String. Der erste Parameter enthält den Ersetzungstext. Der zweite Parameter den zu durchsuchenden Text. Es wird der Text mit den Ersetzungen zurückgegeben. Einführung in Python, 07.07.09 Seite 57