6 Ein- und Ausgabe. Bisher war unsere (Bildschirm-) Ausgabe leichtflüchtig (

Ähnliche Dokumente
Informatik für Schüler, Foliensatz 10 Wiederholung und Listen

Programmieren in C/C++ und MATLAB

8. Arbeiten mit Dateien

7 Beispiel: Markov-Prozesse

Wintersemester Maschinenbau und Kunststofftechnik. Informatik. Tobias Wolf Seite 1 von 23

Python für Linguisten

Übersicht Shell-Scripten

Ein- und Ausgabe. C - Kurs Mario Bodemann. 15. September 2010

E-/A-Funktionalität nicht Teil der Programmiersprache

Ein- und Ausgabe. C - Kurs Mario Bodemann. 15. September 2010

Arithmetik in der tcsh

Übersicht PERL. !!!! Wichtig: Nach dem Befehl einem Strichpunkt setzen!!!!

Einführung in die Programmierung für Computerlinguisten

WS2018/ Oktober 2018

Dateizugriff unter C

Projekt 3 Variablen und Operatoren

Informatik für Schüler, Foliensatz 18 Rekursion

10 Lesen und Schreiben von Dateien

Python 2. Vorlesung Computerlinguistische Techniken Alexander Koller. 28. Oktober 2014

1 Bizz Buzz Woof (ca =18 Punkte) def read file(file_in): fp = open(file_in, r ) l = fp.read() fp.close() return l

Hochschule Darmstadt Informatik-Praktikum WS 2017/2018 WIng Bachelor 6. Aufgabenblatt Zeiger, verkettete Liste, Dateieingabe und -ausgabe

Informatik für Schüler, Foliensatz 2 Ausdrücke, Variablen, Datentypen, Ein- und Ausgabe

WS2017/ Oktober 2017

Programmieren in Python

Excel + VBA. Ergänzungen. Kapitel 1 Einführung in VBA Sequentielle Textdateien HARALD NAHRSTEDT. Erstellt am

5.1 Mehr Basistypen. (Wie viele Werte kann man mit n Bit darstellen?)

Kompaktkurs Einführung in die Programmierung. 11. Ein- und Ausgabe

Arbeiten mit der Shell Teil 2

1 Berechnung von Summen (ca = 10 Punkte)

Programmiersprachen Einführung in C

Strings. Daten aus Dateien einlesen und in Dateien speichern.

Methoden und Wrapperklassen

Einstieg in die Informatik mit Java

Institut für Programmierung und Reaktive Systeme. Java 6. Markus Reschke

JavaScript. Dies ist normales HTML. Hallo Welt! Dies ist JavaScript. Wieder normales HTML.

2 Eine einfache Programmiersprache

2 Eine einfache Programmiersprache. Variablen. Operationen Zuweisung. Variablen

GI Vektoren

Klausur Kompaktkurs Einführung in die Programmierung Dr. T. Weinzierl & M. Sedlacek 25. März 2011

Übungsblatt 1. Java Vorkurs (WS 2017)

2 Eine einfache Programmiersprache

2 Eine einfache Programmiersprache

hue05 November 25, 2016

Hochschule Darmstadt Informatik-Praktikum WS 2017/2018 EIT Bachelor 5. Aufgabenblatt Datenstruktur, Dateieingabe und -ausgabe

Informatik I: Einführung in die Programmierung 3. Werte, Typen, Variablen und Ausdrücke

2 Eine einfache Programmiersprache

Objekte. Theorieteil. Inhaltsverzeichnis. Begriffe. Programmieren mit Java Modul 5. 1 Modulübersicht 3

Python für Linguisten

Die einfachsten Anweisungen

Dateien lesen und schreiben mit php

2.2 Einfache Datenstrukturen

Tutoraufgabe 1 (Zweierkomplement): Lösung: Programmierung WS16/17 Lösung - Übung 2

C++ Teil 2. Sven Groß. 16. Apr IGPM, RWTH Aachen. Sven Groß (IGPM, RWTH Aachen) C++ Teil Apr / 22

Zeichendarstellung. Zeichen sind Zahlen (in C) Zeichen und switch

FH München, FB 03 FA WS 06/07. Ingenieurinformatik. Name Vorname Matrikelnummer Sem.Gr.: Hörsaal Platz

Hochschule Darmstadt Informatik-Praktikum SS 2017 EIT Bachelor 5. Aufgabenblatt Datenstruktur, Dateieingabe und -ausgabe

Programmierpraktikum

11 Objektorientierte Programmierung, Teil 2

Verkettete Datenstrukturen: Listen

Praktikum zu Einführung in die Informatik für LogWiIngs und WiMas Wintersemester 2017/18. Vorbereitende Aufgaben

Ein erstes "Hello world!" Programm

Die Klasse string Verfasser: Christian Bartl

Programmieren in Python

2.5 Primitive Datentypen

4 Daten in Python. Primäres Ziel: Daten zu Containern zusammenfassen, insbesondere Vektoren etc., um vernünftige Beispiele rechnen zu können.

Mapra: C++ Teil 7. Felix Gruber. 3. Juni IGPM, RWTH Aachen. Felix Gruber (IGPM, RWTH Aachen) Mapra: C++ Teil 7 3.

Einführung in die Programmierung II. 5. Zeiger

EiP Übung Sichern Sie im Verzeichnis aufg3 den Inhalt des Artikels im Wochenmagazin "der Freitag" über google in der Datei artikel.

Grundlagen der Informatik

Eine Kommando-Oberfläche für.net

Deshalb ist hello + world = 0. Umgekehrt gilt das Gleiche, weshalb 8 plus 3 gleich 83 ist. Dies ist in Zeile 5 in Terminal 2 gezeigt. In der Regel sol

Einführung in die wissenschaftliche Programmierung 1

1. Referenzdatentypen: Felder und Strings. Referenz- vs. einfache Datentypen. Rückblick: Einfache Datentypen (1) 4711 r

1. Referenzdatentypen: Felder und Strings

Linux-Einführung Übung

1 6. Vorlesung. 1.1 Matplotlib: Graphische Darstellung, Methode der kleinsten Quadrate. Ein kleines Beispiel

Ein- und Ausgabe (I/O)

Kontrollstrukturen. Verzweigungen Einfache Mehrfache Wiederholungen Eine Sequenz durchlaufen Wiederhole bis Solange. Tue

Repetitorium Programmieren I + II

Variablen in MATLAB. Unterschiede zur Mathematik: Symbolisches und numerisches Rechnen. Skriptdateien. for-schleifen.

Input, Output, Dateien

Praktikum zu Einführung in die Informatik für LogWiIngs und WiMas Wintersemester 2016/17. Vorbereitende Aufgaben

Ausdrucksbäume in verschiedenen Darstellungen

hue03 November 11, 2016

Ausbildungsziel: Erstellung eines Briefes mit Hilfe von Vorlagen

Einführung in die Computerlinguistik Einführung in Perl (1)

C++ Teil Schleifen. Man kann bestimme Anweisungen in einem Programm mehrfach ausführen lassen. Dazu gibt es in C++ verschiedene Schleifen.

Informatik I. Informatik I. 6.1 Programme. 6.2 Programme schreiben. 6.3 Programme starten. 6.4 Programme entwickeln. 6.1 Programme.

41.2 LUA Grundlagen - Funktionen

Themen der Übung. Methoden und Wrapperklassen. Vorteile von Methoden. Methoden. Grundlagen

37. Bundeswettbewerb Informatik Anregungen für den Unterricht

Praktikum zur Vorlesung Einführung in die Programmierung WS 14/15 Blatt 3

esc/e e.k. Mühlheide Stemwede Telefon 05773/ Telefax 05773/

Transkript:

6 Ein- und Ausgabe Bisher war unsere (Bildschirm-) Ausgabe leichtflüchtig ( Drucken war hoffnungslos übertrieben); heute lernen wir, wie wir die Ergebnisse unserer Programme abspeichern können, um sie der Nachwelt zu erhalten... 106

Interne und externe Repräsentation von Daten Spätestens jetzt notwendig: Unterscheiden zwischen der internen Speicherung der Objekte (ein Haufen Bits) und ihrer lesbaren Darstellung (eine Folge von Zeichen). Die Umwandlung zwischen z.b. einer Zahl und ihrer externen Darstellung kann implizit (wie in print(27)) oder explizit (wie in %d % 27) erfolgen. Auf jeden Fall ist der String 27 etwas ganz anderes als die Zahl 27 ( 27 + 27 etwa gibt 2727 ). Wir können einen String, der eine Zahl darstellt, mit int in eine ganze Zahl umwandeln: int( 27 ) + int( 27 ) gibt 54. Entsprechend wandelt float in eine Fließkommazahl um: float( 5 ) / float( 2 ) gibt 2.5 Übrigens kann int auch eine Fließkommazahl in eine ganze Zahl umwandeln (Nachkommastellen abschneiden) und float eine ganze Zahl in eine Fließkommazahl: int(5.5)/int(2.) gibt 2 und float(5)/float(2) gibt 2.5 107

Für die Umwandlung in die andere Richtung (Objekt in einen lesbaren String) gibt es mehr Möglichkeiten. Zum einen gibt es die Funktion str, die Objekte in Strings umwandelt: str(5) gibt 5 str(5.) und str(float(5)) geben 5.0 str([1,2.,int( 5 )]) gibt [1, 2.0, 5] Oft haben wir aber genauere Vorstellungen von der Darstellung unserer Objekte (z.b. Zahl der Nachkommaziffern einer Fließkommazahl) dann dran denken, dass wir die Umwandlung auch mit dem %-Operator machen können: %.4f % (10./4.) gibt 2.5000. Strings sind natürlich auch Python-Objekte, mit denen wir weiterarbeiten können (z.b. in einer Variable speichern etc.). Für die Ausgabe auf den Bildschirm/Drucker/in eine Datei ist das Umwandeln der Objekte in eine Folge von Zeichen also nur der erste Schritt: Um die Ausgabe selbst müssen wir uns jetzt noch kümmern. 108

Wir befassen uns hier mit Textdateien: Dateien Inhalt: eine Folge von Zeichen (Buchstaben, Ziffern, Satzzeichen, etc.) Entspricht in etwa einem String, nur eben außerhalb unseres Programms Das Betriebssystem erlaubt uns, Dateien mit Namen zu versehen und in Ordnern abzulegen Bearbeitung z.b. mit Texteditor Unsere Python-Programme sind typische Beispiele für Textdateien Textdateien enthalten keine Informationen über die Darstellung der Zeichen (Schriftart etc.) Der Text kann auf Zeilen aufgeteilt sein: ein spezielles Zeichen Zeilenumbruch, in Python-Strings aufgeschrieben als \n, steht für den Beginn einer neuen Zeile Beispiel: print 1\n2\n3 druckt drei Zeilen (und hinter der 3 noch einmal einen Zeilenumbruch, wie bei print üblich). 109

Nun wollen wir, dass print Dinge nicht wie bisher auf den Bildschirm, sondern in eine Datei schreibt. Dazu erlaubt print, dass als erster Parameter >> und die Angabe einer Datei steht in die wird dann geschrieben. Die Angabe der Datei passiert nicht direkt über den Dateinamen, sondern über ein Dateiobjekt, das mit der Datei verknüpft ist. Die Verknüpfung stellt die Funktion open her wenn s ein String mit dem Namen der Datei ist (z.b. s = blub.txt ), erhält man mit open(s, w ) ein passendes Dateiobjekt. Das speichern wir am besten in einer Variable: f = open( blub.txt, w ) Den ganzen Vorgang nennt man eine Datei zum Schreiben öffnen Wenn alles in der Datei drin ist, müssen wir sie noch mittels f.close() schließen (erst dann ist sicher gestellt, dass die Zeichen auch wirklich in der Datei gelandet sind) 110

Ein Beispiel: f = open( blub.txt, w ) print >>f, 1. Zeile print >>f, 2. Zeile\n3. Zeile f.close() Wenn wir das ausführen, sollte es eine Datei blub.txt geben (in dem Verzeichnis, von dem aus wir Python gestartet haben, solange wir nichts anderes sagen) In der Datei finden wir die drei bedeutungsvollen Zeilen, die wir reingeschrieben haben gab es vorher dort schon eine Datei dieses Namens, ist ihr alter Inhalt dabei verloren gegangen Eine Alternative zu print >>f ist f.write(s) mit einem String s Unterschied ist, dass wir die Umwandlung in Strings selber machen müssen und dass kein Zeilenumbruch automatisch angefügt wird 111

Um an den Inhalt einer Datei zu kommen, müssen wir sie zum Lesen öffnen, dazu bekommt open statt des w ( write ) ein r ( read ) die Datei muss (im richtigen Verzeichnis) existieren, sonst gibt s einen Fehler. Dann liefert uns für das Dateiobjekt f die Methode f.readline() die nächste Zeile der Datei (einschließlich des abschließenden \n ) am Ende der Datei den leeren String. Alternativen: f.readlines() liest alle Zeilen und gibt sie als Liste von Strings zurück; außerdem ist das Dateiobjekt iterierbar (Beispiele folgen). Wenn wir nichts mehr aus der Datei lesen wollen, sollten wir sie schließen (wie gehabt) 112

Beispiele zum Datei-Lesen zunächst f.readlines(): f = open( blub.txt, r ) l = f.readlines() f.close() print l Mit unserem oben erzeugten blub.txt druckt das [ 1. Zeile\n, 2. Zeile\n, 3. Zeile\n ] Dasselbe mit f.readline(): f = open( blub.txt, r ) l = [] s = f.readline() while s!= : l.append(s) s = f.readline() f.close() print l Dasselbe mit for-schleife: f = open( blub.txt, r ) l = [] for s in f: l.append(s) f.close() print l 113

Beispiel: Mittelwert berechnen Bei Programmen, die rechnen, werden die Dateien zum Großteil Zahlen enthalten. Dann müssen wir bei Einlesen die Strings (die hoffentlich eine Dezimaldarstellung einer Zahl enthalten) in Zahlen umwandeln. Hier ist eine Funktion, die einen Dateinamen als Parameter hat, aus der Datei Zahlen liest (wir gehen davon aus, dass die Datei existiert und in jeder ihrer Zeilen genau eine Zahl steht) und deren Mittelwert berechnet: def mittelwert(nam): f = open(nam, r ) sum = 0. n = 0 for s in f: sum = sum + float(s) n = n+1 f.close() return sum/n So könnte eine Eingabedatei mwtest.txt aussehen (float ist relativ robust... ) 0.5 1.0 0.2e1 4 114

Strings zerlegen Wenn in unserer Datei mehrere Werte pro Zeile haben, müssen wir den String zerlegen dazu ist die Methode split nützlich. Sie arbeitet auf einem String und liefert eine Liste von Bestandteilen zurück. Die Methode kann einen weiteren String den Separator als Parameter bekommen, in diesem Fall wird an diesem Separator geteilt. Mehrere Separatoren hintereinander erzeugen leere Teilstrings Z.B. für s = 1:2:3::4\n5:: gibt s.split( : ) die Liste [ 1, 2, 3,, 4\n5,, ] Ohne Parameter wird an Whitespace getrennt das sind Folgen von Leerzeichen, Tabulatorzeichen, Zeilenumbrüchen etc. Mehrere Whitespace-Zeichen hintereinander zählen wie eins, Whitespace am Anfang und am Ende des Strings wird ignoriert. Z.B. für s = 1 2\n3 \n 4\n\n gibt s.split() die Liste [ 1, 2, 3, 4 ] (Eine Liste von 4 Strings, keine Zahlen!) 115

Beispiel: Teilerliste Damit wir Daten haben, die wir in einer Datei speichern können, erzeugt diese Funktion für die Zahlen 1,..., n je eine Liste mit allen ihren Teilern und gibt eine Liste dieser Listen zurück: def teilerliste(n): l = [[] for i in range(1,n+1)] for teiler in range(1,n+1): i = teiler while i<=n: l[i-1].append(teiler) i = i+teiler return l Nun ist z.b. l = teilerliste(6) die Liste [[1], [1, 2], [1, 3], [1, 2, 4], [1, 5], [1, 2, 3, 6]] und l[3][1] ist der zweite Teiler von 4, also die 2. 116

Nun schreiben wir das Ergebnis (das hier als Parameter l übergeben wird) in einer Datei f, die zum Schreiben geöffnet sein muss. def druckeliste(l, f): for i in range(1,len(l)+1): tl = l[i-1] f.write( %d: % i) for t in tl: f.write( %d % t) f.write( \n ) Weil nicht der Dateinamen, sondern das Dateiobjekt übergeben wird, müssen wir uns um s Öffnen und Schließen noch kümmern: f = open( tliste.txt, w ) druckeliste(teilerliste(6), f) f.close() 1: 1 2: 1 2 3: 1 3 4: 1 2 4 5: 1 5 6: 1 2 3 6 117

Vorteil von Dateiobjekten (statt Dateinamen) als Parameter: wir können nun auch auf den Bildschirm (d.h., auf das Terminalfenster, in dem unsere ganzen Python-Ausgaben normalerweise landen: das Standardausgabegerät) ausgeben. Der hat zwar keinen Dateinamen, aber ein Dateiobjekt, das stdout heißt und im Paket sys definiert ist. Diese Datei ist automatisch zum Schreiben geöffnet. So können wir das verwenden: import sys druckeliste(teilerliste(12), sys.stdout) 118

Nun aber zum eigentlichen Ziel des Beispiels: die von druckeliste erzeugte Datei wieder einlesen, die Zeilen in ihre Bestandteile zerlegen und die Zahlen so zu Listen zusammenbauen, dass das Ergebnis dasselbe ist wie bei teilerliste. Parameter ist ein Dateiobjekt f, das zu einer zum Lesen geöffneten Datei gehören muss. def liesliste(f): l = [] for zeile in f: s1 = zeile.split( : ) s2 = s1[1].split() l.append([int(s) for s in s2]) return l f = open( tliste.txt, r ) l = liesliste(f) f.close() druckeliste(l, sys.stdout) 119

Selber machen! Vorschlag zum Üben: eine Funktion schreiben, die zunächst einen Dateinamen als Parameter bekommt und alle Zeilen dieser Datei ausdruckt. Dann wird die Funktion ausgebaut: Sie bekommt einen zweiten Parameter, der auch ein Dateiname sein soll (verschieden vom ersten Dateinamen); die Ausgabe soll nun in diese Datei geschrieben werden (wir kopieren also die Eingabedatei). Und nun ein dritter Parameter, von dem wir annehmen, dass er eine Funktion f mit einem Fließkommaparameter und mit Fließkommaergebnis ist (z.b. die Funktionen, die wir bei der numerischen Quadratur benutzt hatten). Wir gehen nun davon aus, dass jede Zeile der Eingabedatei eine der beiden folgenden Formen hat: Sie beginnt mit einem # in dem Fall soll sie einfach kopiert werden. Oder sie enthält eine Zahl x in dem Fall soll in die Ausgabedatei eine Zeile mit x und f (x) geschrieben werden. 120

Angenommen, die Funktion wäre def quadrat(x): return x**2 Wenn die Eingabedatei so aussieht: # negative Zahlen -1 # Null 0 # positive Zahlen 1 2 Dann soll die Ausgabedatei so aussehen: # negative Zahlen -1.0 1.0 # Null 0.0 0.0 # positive Zahlen 1.0 1.0 2.0 4.0 121