Schreibprogramme. Wir alle kennen und lieben sie und haben unsere dunkelsten Momente mit ihnen geteilt als die Deadlines an uns vorbei zogen. Wir sind bei ihnen geblieben, obwohl ihre völlig widersinnigen Einrückungsparameter nie Sinn ergaben, dafür boten sie uns Hours of Procrastination beim Formatieren unserer Hausarbeiten. Und alles nur weil wir nie LaTex gelernt haben.
Heute lernen wir wieder ein Stück theoretischer Emanzipation von der herkömmlichen Software und schreiben unseren eigenen simplen Texteditor. Bei genauerem Hinsehen werdet ihr merken, dass er nicht so optimal geeignet ist für jeden Text der über ein Hentai oder wie das heißt hinausgeht aber bei NOCH genauerem Hinsehen werdet ihr erst merken, dass es darum gar nicht geht. Genauer gesagt geht es um das
Arbeiten mit Dateien in Programmen.
Dieses Programm habe ich aus der 16. Übung aus Learn Python the Hard Way und ein bisschen verändert.
Es ist wirklich sehr simpel und dient vor allem dem Erlernen des Umgangs mit Dateien, die ich in ein Programm einbinden will bzw. wie ich Programme schreibe die etwas mit meinen Dateien anstellen.
1. Was macht das Programm?
Grob gesagt: Es öffnet eine von dir bestimmte Datei, um den Inhalt dann zu löschen (weswegen du dir gut überlegen solltest, welche Datei du dem Programm gibst). Danach kannst du dem Programm drei Zeilen geben, die direkt in das Programm neu reingeschrieben werden. Am Ende liest es dir nochmal den Inhalt des Programms vor.
2. Datei anlegen
Das Programm wird dich nach einer Eingabe fragen die direkt in eine Textdatei geschrieben wird. Diese Textdatei kann entweder eine bereits existierende sein, die aber ACHTUNG gelöscht wird um neu beschrieben zu werden oder du erstellst einfach eine neue, leere, um sicherzugehen. Das kannst du bspw. auf der Linux-Konsole mit dem Befehl „nano haiku“ machen. Dann wird eine neue Datei angelegt, die du mit CTRL+O speicherst. Du kannst sie mit „nano haiku“ auch jederzeit wieder aufrufen, modifizieren und neu abspeichern. Es kann natürlich jeder andere beliebige Texteditor angewandt werden. Ich persönlich mag es simpel.
(Wenn dir Begriffe wie Editor, Konsole, Nano usw. nicht sagen, solltest du dich erstmal mit den notwendigen Basics bekannt machen. Das geht schön unterhaltsam und kompakt bei http://cli.learncodethehardway.org/ )
3. Code schreiben
Die Datei heißt bei mir ex16.py, sie kann aber auch haiku.py oder fiona.py heißen. Du erstellst sie wieder mit nano oder einem anderen Editor. Hier der Code (immer schön abtippen, Kinder!)
from sys import argv script, filename = argv # 1 print "We're going to erase the content of %r. " % filename print "If you don't want that, hit CTRL-C (^C) ." print "If you do want that, hit RETURN." raw_input("?") #2 print "Opening the file..." target = open(filename, 'w') #3 print "Truncating the file. Goodbye!" target.truncate() #4 print "Now I'm going to ask you for three lines." line1 = raw_input("line 1: ") line2 = raw_input("line 2: ") line3 = raw_input("line 3: ") print "I'm going to write these to the file." target.write(line1) #5 target.write("\n") target.write(line2) target.write("\n") target.write(line3) target.write("\n") print "And finally, we close it." target.close() #6 txt = open(filename) #7 print "Here's the new content of your file %s:" % filename print txt.read() #8
4. Das Programm ausführen
Ich rufe das Programm auf und gebe dabei die Datei, in welche ich schreiben will als Parameter mit. Also tippe ich
python ex16.py haiku
in meine Konsole. Es erscheinen die ersten paar Zeilen, die mich fragen, ob ich wirklich weitermachen will. Wenn ich entsprechend RETURN drücke, erscheinen die nächsten Zeilen nach dem Fragezeichen, die mich freundlich darauf hinweisen, dass jetzt wirklich die Datei „haiku“ geöffnet und geleert wird.
We're going to erase 'haiku'. If you don't want that, hit CTRL-C (^C) . If you do want that, hit RETURN. ? Opening the file... Truncating the file. Goodbye!
Als nächstes werden drei Zeilen die ich eintippe eingelesen.
Ich habe mich nach langem Überlegen für ein 5-7-5-Versmaß entschieden und gebe es an das Programm weiter. Die Zeilen werden in meine Datei „haiku“ geschrieben und um das zu überprüfen lasse ich mir gleich nochmal den Inhalt von „haiku“ vorlesen, bzw. ausgeben:
Now I'm going to ask you for three lines. line 1: Der Frühling kommt bald line 2: Sonne scheint hell auf die Stadt line 3: Egal, Computer. I'm going to write these to the file. And finally, we close it. Here's your file haiku: Der Frühling kommt bald Sonne scheint hell auf die Stadt Egal, Computer.
5. Code erklärt
Keine Sorge. Es ist ein wirklich super einfaches Programm, es folgt nur so viel Text weil ich so gut wie möglich versuche, es ganz detailliert und für AnfängerInnen verständlich zu schreiben. Einiges habe ich selber noch gar nicht verstanden, aber das ist mit dem angemessenen Warnhinweis versehen. Olé! Los geht’s:
Was bei #1 und #2 passiert wird bereits in der Beleidigungsmaschine ausführlicher erklärt. Die Zeile bei #1 sorgt dafür, dass du beim Aufrufen des Programms die Werte für die hier angewandten Variablen bestimmst und sie nicht in das Programm reincodest. In diesem Fall gebe ich nicht einfach nur „python ex16.py“ ein, sondern „python ex16.py haiku“ – auf das python folgt nicht nur der script-Name sondern auch der filename.
Bei #2 wird etwas das du tippst eingelesen, der „Prompt“, bzw. die Fragestellung dazu steht in Klammern und beläuft sich hier auf ein einfaches Fragezeichen. In den Zeilen mit print wird einfach ausgenutzt, dass du ein Programm jederzeit mit Ctrl+C abbrechen kannst. Wenn du Return drückst, geht es natürlich weiter. Also ein billiger Trick, der später mit Konstruktionen, die Bedinungen darstellen umgesetzt wird.
#3 Wir öffnen eine Datei mit open(filename, ‚w‘). Filename ist bereits bestimmt durch den Parameter den wir beim Aufrufen des Programms dazugeliefert haben, hier: „haiku“. In diesem Falle wird die Datei im „write“-Modus geöffnet, wofür das ‚w‘ hinzugefügt wurde. Ich fand es selber etwas schwierig herauszufinden, ob das ‚w‘ notwendig ist, aber vielleicht hat ja jemensch eine Antwort in den Kommentaren. Ihr merkt vielleicht, dass nicht nur die Datei geöffnet wird, sondern der Prozess auch die Variable „target“ mit einem Wert belegen soll. Denn das Öffnen der Datei liefert ein „file object“ zurück. Das ist nicht der Inhalt der Datei, sondern ein Objekt auf das wir uns im weiteren Verlauf des Programms beziehen können.
Was ein Objekt genau ist, ist eine eigentlich etwas wichtigere Frage, die ich aber selber noch nicht ausreichend beantworten kann. Beizeiten!
#4 Hier wird der Inhalt der Datei gelöscht mit truncate. Als nächstes werden drei Zeilen via raw_input eingelesen. Es ist recht offensichtlich, dass diese bei #5 Stück für Stück in die Datei eingearbeitet werden. Das kann eleganter gelöst werden, sobald wir Schleifen programmieren können. Die sind genau dafür da, dumme Aufgaben immer wieder ausführen zu lassen, das habe ich schon einmal erklärt als ich noch C lernte (oder es versuchte).
#6 Hier wird die Datei sozusagen geschlossen und bei #7 öffne ich sie wieder um sie in den folgenden Zeilen zu lesen. Das hätte ich auch weniger umständlich machen können aber der Einfachheit halber mache ich diesen Umweg. Filename ist weiterhin diejenige Datei, die ich beim Aufrufen des Programms als Parameter mitgebe. Der Name wird als String ausgegeben statt des Platzhalters %s.
Bei #8 wird die Datei, die wir gerade erst beschrieben haben schließlich gelesen und ausgegeben mit print. Damit kannst du überprüfen ob der Inhalt korrekt in die Datei geschrieben wurde.
Editorial
Streng genommen habe ich keine Ahnung ob man das Programm überhaupt als Editor bezeichnen kann. Aber das ist auch egal. Wichtig ist, dass gelernt wird, wie man in Programmen mit Dateien rumsaut. Ab jetzt kann ich mit einem Programm nicht nur eigens für das Programm angelegten Text bearbeiten sondern auch bereits vorhandenen Text in Dateien analysieren (wieviele Wörter?) und modifizieren (jedes „Leistungsschutzrecht“ in einem Text mit „Pferdefleisch“ ersetzen). Das öffnet Tor und Tür für die vielen Möglichkeiten, Programme als Werkzeuge zu verwenden, die euch den Alltag erleichtern oder euch dabei helfen, ein Problem zu bewältigen bzw. technisch zu lösen.
Ich bin selber noch nicht sehr viel weiter im LPTHW, brauche auch noch ein bisschen, bis ich bspw. mit meiner Datei „tagebuch“ rumexperimentieren kann. Denkbar wäre ein Programm, das mir jeden Tag den Eintrag vor einem Jahr ausgibt, das hat leitmedium auch schon mal gemacht. Aber bis ich wirklich auf ein Jahr Tagebuch zurückschauen kann, dauert es zum Glück noch ein wenig, bis dahin möchte ich das aber gerne verstanden haben um es dann nachzuprogrammieren und zu modifizieren.
Haiku Five!