Kapitel 9: Ein- und Ausgabe Einführung in die Informatik Wintersemester 2007/08 Prof. Bernhard Jung Ein- und Ausgabe: Übersicht Interaktive Ein- und Ausgabe in Python-Interpreter Eingabe: input(), raw_input() Ausgabe: print auch formatierte Ausgabe (siehe auch Übungen), z.B. >>> print '%1.3f' % 1.2 1.200 Ein- und Ausgabe von / in Dateien Datenbanken später Prof. B. Jung Einführung in die Informatik, WS 2007/08 TU Bergakademie Freiberg 1 Interaktive Eingabe (Wdh) Eingabe in der Python-Shell raw_input() input() Rückgabewert ist immer vom Typ String Typ des Rückgabewerts entsprechend Eingabewert >>> i = input("Geben Sie eine Zahl ein: ") Geben Sie eine Zahl ein: 10 >>> print type(i), i + 1 <type 'int'> 11 >>> i = raw_input("Geben Sie eine Zahl ein: ") Geben Sie eine Zahl ein: 10 >>> print type(i), i + 1 <type 'str'> Traceback (most recent call last): File "<pyshell#34>", line 1, in -toplevelprint type(i), i + 1 TypeError: cannot concatenate 'str' and 'int' objects >>> Prof. B. Jung TU Bergakademie Freiberg Einführung in die Informatik, WS 2007/08 Interaktive Eingabe – Beispiele Eingabe einer beliebigen Anzahl von Zahlen def leseWerte(): """Interaktives Einlesen von Zahlen-Werten. Abbruch bei Eingabe einer Zahl < 0. """ werte = [] zahl = 0 # Dummy-Wert while (zahl >= 0 ): zahl = input("Eingabe einer Zahl --> ") if zahl >= 0: werte.append(zahl) return werte >>> l = leseWerte() Eingabe einer Zahl --> Eingabe einer Zahl --> Eingabe einer Zahl --> Eingabe einer Zahl --> Eingabe einer Zahl --> >>> print l [1, 1.2, 3, 4] Prof. B. Jung 1 1.2 3 4 -1 Aber, falls Eingabe keine Zahl: (Behandlung mit 'Exceptions', fortgeschrittenes Thema) >>> leseWerte() Eingabe einer ganzen Zahl --> 2 Eingabe einer ganzen Zahl --> zwei Traceback (most recent call last): File "<pyshell#17>", line 1, in toplevel-leseWerte() TU Bergakademie Freiberg Einführung in die Informatik, WS 2007/08 … NameError: name 'zwei' is not defined 2 Interaktive Eingabe – Beispiele Textbasiertes Menü (1/2) Auswahl von Optionen in zeichenorientierte Benutzerschnittstelle Was wollen Sie als naechstes tun? (E)ingabe einer neuen Zahl (L)iste aller Eingaben (B)eenden Ihre Wahl: def dialog(): zahlen = [] eingabe = "" while eingabe not in ['B', 'b']: print "\nWas wollen Sie als naechstes tun?" print " (E)ingabe einer neuen Zahl" print " (L)iste aller Eingaben" print " (B)eenden" eingabe = raw_input("Ihre Wahl: ") if eingabe in ['E','e']: z = int( input("Geben Sie eine ganze Zahl ein: ") ) zahlen.append(z) elif eingabe in ['L','l']: print "Eingaben bisher:", zahlen print "Vielen Dank. Auf Wiedersehen!" Prof. B. Jung TU Bergakademie Freiberg Einführung in die Informatik, WS 2007/08 Interaktive Eingabe – Beispiele Textbasiertes Menü (2/2) Was wollen Sie als naechstes tun? (E)ingabe einer neuen Zahl (L)iste aller Eingaben (B)eenden Ihre Wahl: E Geben Sie eine ganze Zahl ein: 4 Was wollen Sie als naechstes tun? (E)ingabe einer neuen Zahl (L)iste aller Eingaben (B)eenden Ihre Wahl: e Geben Sie eine ganze Zahl ein: 777 Was wollen Sie als naechstes tun? (E)ingabe einer neuen Zahl (L)iste aller Eingaben (B)eenden Eingabe entspricht keiner Ihre Wahl: g# Option Æ weiter Was wollen Sie als naechstes tun? (E)ingabe einer neuen Zahl (L)iste aller Eingaben (B)eenden Ihre Wahl: l Eingaben bisher: [4, 2, 777] Was wollen Sie als naechstes tun? (E)ingabe einer neuen Zahl (L)iste aller Eingaben (B)eenden Ihre Wahl: E Geben Sie eine ganze Zahl ein: 2.8 Prof. B. Jung Was wollen Sie als naechstes tun? (E)ingabe einer neuen Zahl (L)iste aller Eingaben (B)eenden Ihre Wahl: b Vielen Dank. Auf Wiedersehen! Eingabe von Float Æ Konvertierung zu Integer, hier 2in die Informatik, WS 2007/08 Einführung TU Bergakademie Freiberg 3 Arbeiten mit Dateien Ziel: Verfügbarkeit von Daten auch nach Beendigung eines Programms Æ Speichern der Daten in Dateien Prinzipielles Vorgehen beim Arbeiten mit Dateien 1. 2. 3. Öffnen der Datei (wiederholtes) Lesen bzw. Schreiben von Daten Schließen der Datei Prof. B. Jung Einführung in die Informatik, WS 2007/08 TU Bergakademie Freiberg Öffnen und Schließen von Dateien f = open(filename, mode) Erzeugt ein Objekt f vom Typ file Mode r – Datei zum Lesen öffnen. Die Datei muss existieren. w – Datei zum Schreiben öffnen. Existiert eine gleichnamige Datei, wird sie gelöscht. a – Schreiben am Ende einer Datei. Die Datei muss existieren. r+ - Lesen und Schreiben. Die Datei muss existieren. w+ - Lesen und Schreiben. Existiert eine gleichnamige Datei, wird sie gelöscht. a+ - Lesen und Schreiben am Ende einer Datei. Die Datei muss existieren. f.close() Anwendung der Methode close() auf das file-Objekt f Prof. B. Jung Einführung in die Informatik, WS 2007/08 TU Bergakademie Freiberg 4 In Dateien Schreiben Schreiben von Strings f.write(String) f.writeLines([String1, String2, … ]) Schreiben verschiedener Datentypen mittels print Ausgabe erscheint in Datei wie bei print im Interpreter print >> f, data z.B. Prof. B. Jung print >> f, 10 print >> f, "Hallo Welt" print >> f, "%x" % 15 # Ausgabe als Hexadezimalzahl Einführung in die Informatik, WS 2007/08 TU Bergakademie Freiberg In Dateien Schreiben – Beispiel (write) def saveList(filename,list): f = open(filename, 'w') # for i in list: f.write( str(i) ) # f.write( "\n") # f.close() # Übergabe des Dateinamen als Raw-String open file for writing write each list element as string start a new line close the file Verzeichnis c:\temp muss existieren >>> saveList(r'c:\temp\list1.txt', [1,'zwei', 3.0]) >>> Prof. B. Jung Einführung in die Informatik, WS 2007/08 TU Bergakademie Freiberg 5 In Dateien Schreiben – Beispiel (print) def saveList2(filename,list): f = open(filename, 'w') # open file for writing for i in list: print >> f, i # print each list element to the file f.close() # close the file Übergabe des Dateinamen als normaler String Verzeichnis c:\temp muss existieren >>> saveList2('c:\\temp\\list2.txt', [1,'zwei', 3.0, (1,2) ]) >>> Prof. B. Jung Einführung in die Informatik, WS 2007/08 TU Bergakademie Freiberg Aus Dateien Lesen Methoden f.read() – gibt die ganze Datei zurück (als String) f.read(n) – liest n Zeichen f.readline() – liest eine Zeile (d.h. bis '\n') f.readlines() – gibt eine Liste zurück; jedes Element ist eine Zeile der gelesenen Datei f Prof. B. Jung Einführung in die Informatik, WS 2007/08 TU Bergakademie Freiberg 6 Aus Dateien Lesen - Beispiel def readList(filename): f = open(filename, 'r') # open file for reading lines = f.readlines() # read all lines f.close() return lines Datei c:\temp\list2.txt muss existieren >>> readList2(r'c:\temp\list2.txt') ['1\n', 'zwei\n', '3.0\n', '(1, 2)\n'] >>> Rückgabe: Liste von Strings Prof. B. Jung TU Bergakademie Freiberg Einführung in die Informatik, WS 2007/08 Ein- und Ausgabe mit dem Modul pickle Problem bisher beim Einlesen read-Funktionen liefern nur Strings Einlesen anderer Datentypen erfordert explizite Konvertierung >>> i = int('1') >>> j = int('2\n') >>> print i, j 1 2 z.B. mittels int(), float()-Funktionen für komplexe Datentypen (Listen, Mengen, Objekte) noch komplexer fehleranfällig! Modul pickle (etwa: Einpökeln): ermöglicht Speichern und anschließendes Auslesen beliebiger Objekte ohne explizite Konvertierung Funktionen dump(data, file) # schreibe Daten data in Datei file load(file) # lädt Daten aus Datei; Rückgabe als ein Objekt Mögl. Nachteile Prof. B. Jung gespeicherte Dateiinhalte nicht mehr unbedingt für Menschen verständlich funktioniert nur bei Schreiben und Lesen von Python aus (Dateien für andere Programmiersprachen nicht direkt interpretierbar) Einführung in die Informatik, WS 2007/08 TU Bergakademie Freiberg 7 Modul pickle - Beispiel def saveWithPickle(filename, obj): f = open(filename, 'w') # open file for writing from pickle import dump dump(obj, f) f.close() def readWithPickle(filename): f = open(filename, 'r') # open file for reading from pickle import load obj = load(f) f.close() return obj >>> saveWithPickle(r'c:\temp\list3.txt', ['eins', 2, 3.0, {"otto":1}] ) >>> readWithPickle(r'c:\temp\list3.txt') ['eins', 2, 3.0, {'otto': 1}] >>> Prof. B. Jung Einführung in die Informatik, WS 2007/08 TU Bergakademie Freiberg 8