Paul Barry, Python von Kopf bis Fuß, O´Reilly, ISBN ... · Wollen Sie effektiv mit Ihren Daten...
Transcript of Paul Barry, Python von Kopf bis Fuß, O´Reilly, ISBN ... · Wollen Sie effektiv mit Ihren Daten...
Paul Barry, Python von Kopf bis Fuß, O´Reilly, ISBN 9783897213180
D3kjd3Di38lk323nnm
Der Inhalt
vii
Der Inhalt (im Überblick)
Der Inhalt (jetzt ausführlich)
Ihr Gehirn und Programmieren. Sie versuchen, etwas zu lernen, und
Ihr Hirn tut sein Bestes, damit das Gelernte nicht hängen bleibt. Es denkt nämlich: »Wir
sollten lieber ordentlich Platz für wichtigere Dinge lassen, z.B. für das Wissen darüber,
welche Tiere einem gefährlich werden könnten, oder dass es eine ganz schlechte Idee
ist, nackt Snowboard zu fahren.« Tja, wie schaffen wir es nun, Ihr Gehirn davon zu
überzeugen, dass Ihr Leben davon abhängt, etwas über Python zu wissen?
Einführung
Für wen ist dieses Buch? xxii
Wir wissen, was Sie gerade denken xxiii
Metakognition xxv
So machen Sie sich Ihr Gehirn untertan xxvii
Lies mich xxviii
Die technischen Gutachter xxx
Danksagungen xxxi
Einführung xxi
1 Dürfen wir vorstellen: Python! Alle lieben Listen 1
2 Code teilen: Module mit Funktionen 33
3 Dateien und Ausnahmen: Fehlerbewältigung 73
4 Persistenz: Daten in Dateien speichern 105
5 Daten verstehen: Daten verarbeiten 139
6 Eigene Datenobjekte: Code und Daten bündeln 173
7 Webentwicklung: Die Teile zusammenfügen 213
8 Mobile Apps: Kleine Geräte 255
9 Daten im Griff: Eingaben verarbeiten 293
10 Größere Dimensionen: Ins Leben treten 351
11 Komplexität bewältigen: Daten strukturieren 397
Anhang Was übrig bleibt: Die Top-Ten der Dinge, die wir nicht behandelt haben 435
Index 447
Der Inhalt
viii
Was ist so toll an Python? 2
Python 3 installieren 3
Mit IDLE leichter Python lernen 4
Effektiv mit IDLE arbeiten 5
Mit komplexen Daten arbeiten 6
Einfache Python-Listen erstellen 7
Listen sind wie Arrays 9
Der Liste weitere Daten hinzufügen 11
Mit Listendaten arbeiten 15
for-Schleifen arbeiten mit Listen jeder Größe 16
Listen in Listen speichern 18
Eine Liste auf Listen prüfen 20
Die Verarbeitung komplexer Daten ist kompliziert 23
Mehrere Einbettungsstufen bewältigen 24
Funktionen statt Codewiederholung 28
In Python eine Funktion erstellen 29
Rekursion als Retter! 31
Ihr Python-Werkzeugkasten 32
Alle lieben Listen1Dürfen wir vorstellen: Python!
Sie wollen wissen, was an Python so besonders sein soll? Die kurze Antwort ist: Vieles. Die lange Antwort beginnt mit der Feststellung, dass es auch
Vieles gibt, das Ihnen vertraut sein sollte. Python hat viele Gemeinsamkeiten mit all den
anderen Allzweck-Programmiersprachen, z.B. Anweisungen, Ausdrücke, Operatoren,
Funktionen, Module, Methoden und Klassen. Eigentlich all den üblichen Kram. Aber dann
gibt es eben auch viele zusätzliche Möglichkeiten, mit denen Python dem Programmierer das
Leben erleichtert – also Ihnen. Sie werden Ihre Python-Reise mit Listen beginnen. Aber bevor
wir uns diesen zuwenden, müssen wir uns einer anderen wichtigen Frage stellen …
Die Ritter der Kokosnuss, 1975, Terry Jones & Terry Gilliam, 91 Min.
Graham Chapman
Michael Palin, John Cleese, Terry Gilliam, Eric Idle & Terry Jones
Paul Barry, Python von Kopf bis Fuß, O´Reilly, ISBN 9783897213180
Der Inhalt
ix
Module mit FunktionenWiederverwendbarer Code ist gut, teilbare Module sind besser. Wenn Sie Ihren Code als Python-Modul verteilen, öffnen Sie ihn für die gesamte
Python-Gemeinschaft … und Teilen ist doch immer gut, oder? In diesem Kapitel werden
Sie lernen, wie Sie eigene Module erstellen, installieren und verteilen. Dann laden Sie
Ihr Modul auf Pythons Software-Distributionssite im Web, damit alle von Ihrer Arbeit
profitieren können. Unterwegs werden Sie außerdem ein paar neue Tricks zu Pythons
Funktionen aufschnappen.
Code teilen
2Zu gut, um es für sich zu behalten 34
Die Funktion in ein Modul umwandeln 35
Module sind überall 36
Ihren Code kommentieren 37
Das Paket vorbereiten 40
Ihr Paket erstellen 41
Ein kurzer Überblick über Ihr Paket 42
Ein Modul zur Verwendung importieren 43
Pythons Module implementieren Namensräume 45
Für die PyPI-Website registrieren 47
Ihren Code auf PyPI hochladen 48
Willkommen in der PyPI-Gemeinschaft 49
Verhalten mit einem weiteren Argument steuern 52
Bevor Sie neuen Code schreiben, sollten Sie BIF denken 53
Python gibt sein Bestes, um Ihren Code auszuführen 57
Ihren Code nachverfolgen 58
Herausfinden, was falsch ist 59
Den neuen Code auf PyPI hochladen 60
Sie haben Ihre API geändert 62
Optionale Argumente 63
Ihr Modul unterstützt beide APIs 65
Ihre API passt immer noch nicht 66
Der Ruf Ihres Moduls ist wiederhergestellt 70
Ihr Python-Werkzeugkasten 71
schachtler
schachtler.py
setup.py
Der Inhalt
x
Daten kommen von draußen her 74
Es sind bloß Textzeilen 75
Ein genauer Blick auf die Daten 77
Machen Sie sich mit Ihren Daten vertraut 79
Machen Sie sich mit Ihren Methoden vertaut 80
Machen Sie sich (besser) mit Ihren Daten vertraut 82
Zwei sehr unterschiedliche Verfahren 83
Zusätzliche Logik ergänzen 84
Ausnahmen verarbeiten 88
Erst probieren, dann erholen 89
Den zu schützenden Code identifizieren 91
Bei Fehlern passen 93
Was ist mit anderen Fehlern? 96
Mehr Code zur Fehlerprüfung … 97
… oder eine weitere Ausnahmebehandlungsstufe einführen 98
Und welches Verfahren ist jetzt besser? 99
Sie sind fertig … von einer kleinen Sache abgesehen 101
Machen Sie Ihre Ausnahmen wählerisch 102
Ihr Python-Werkzeugkasten 103
Fehlerbewältigung3Dateien und Ausnahmen
Es ist einfach nicht genug, Listendaten im Code zu verarbeiten. Sie müssen Daten auch problemlos in Ihre Programme bringen. Sicher ist es keine Über-
raschung für Sie, dass Python das Lesen von Daten aus Dateien zu einem Kinderspiel
macht. Das ist auch gut so. Bedenken Sie aber auch was alles schieflaufen kann, wenn Sie
mit Daten arbeiten, die nicht unter der Kontrolle Ihres Programms stehen … Hier gibt es viele
Stolpersteine, insofern sind bestimmte Strategien zur Problembehandlung erforderlich! Eine
davon ist die Bewältigung außergewöhnlicher Situationen mit Pythons Mechanismen zur
Ausnahmebehandlung, die in diesem Kapitel vorgestellt werden.
split(bohnen)
Paul Barry, Python von Kopf bis Fuß, O´Reilly, ISBN 9783897213180
Der Inhalt
xi
Daten in Dateien speichernEs ist wunderbar, wenn man dateibasierte Daten verarbeiten kann. Aber was passiert mit Ihren Daten, wenn Sie fertig sind? Natürlich ist es am besten,
Sie speichern Ihre Daten in einer Datei auf der Festplatte und verschaffen sich damit
die Möglichkeit, sie später wieder nutzen zu können. Dass Sie Ihre im Speicher
befindlichen Daten nehmen und auf der Festplatte speichern, ist das, worum es bei
Persistenz geht. Python unterstützt die üblichen Werkzeuge zum Schreiben von
Dateien und bietet einige coole Einrichtungen zur effizienten Speicherung von Python-
Daten. Blättern Sie um und beginnen wir, uns mit Ihnen vertraut zu machen.
Persistenz
4
Programme generieren Daten 106
Eine Datei im Schreibmodus öffnen 110
Nach einer Ausnahme bleiben Dateien offen! 114
try mit finally erweitern 115
Den Typ des Fehlers zu kennen, reicht nicht 117
Nutzen Sie with, um mit Dateien zu arbeiten 120
Standardformate sind für Dateien ungeeignet 124
Warum modifizieren wir nicht print_lvl()? 126
Daten konservieren 132
Mit dump speichern und mit load wiederherstellen 133
Allgemeine Datei-Ein-/Ausgabe ist das geeignetere Verfahren! 137
Ihr Python-Werkzeugkasten 138
['Is this the right room for an argument?', "No you haven't!", 'When?', "No you didn't!", "You didn't!", 'You did not!', 'Ah! (taking out his wallet and paying) Just the five minutes.', 'You most certainly did not!', "Oh no you didn't!", "Oh no you didn't!", "Oh look, this isn't an argument!", "No it isn't!", "It's just contradiction!", 'It IS!', 'You just contradicted me!', 'You DID!', 'You did just then!', '(exasperated) Oh, this is futile!!', 'Yes it is!']
[‘Is this the right room for an argument?’, “No you haven’t!”, ‘When?’, “No you didn’t!”, “You didn’t!”, ‘You did not!’, ‘Ah! (taking out his wallet and paying) Just the five minutes.’, ‘You most certainly did not!’, “Oh no you didn’t!”, “Oh no you didn’t!”, “Oh look, this isn’t an argument!”, “No it isn’t!”, “It’s just contradiction!”, ‘It IS!’, ‘You just contradicted me!’, ‘You DID!’, ‘You did just then!’, ‘(exasperated) Oh, this is futile!!’, ‘Yes it is!’]
Der Inhalt
xii
Trainer Tim braucht Ihre Hilfe 140
Eines von zwei Sortierverfahren wählen 144
Das Problem mit der Zeit 148
Listen verstehen 155
Iteration zur Entfernung von Duplikaten 161
Duplikatfrei mit Sets 166
Ihr Python-Werkzeugkasten 172
Daten verarbeiten5Daten verstehen
Daten gibt es in den unterschiedlichsten Formen und Größen, Formaten und Kodierungen. Wollen Sie effektiv mit Ihren Daten arbeiten, müssen Sie sie häufig manipulieren und
in ein allgemeines Format überführen, das eine effektive Verarbeitung, Sortierung und
Speicherung erst möglich macht. In diesem Kapitel werden wir uns unterschiedliche
Python-Werkzeuge ansehen, die Ihnen helfen, Ihre Daten so richtig auf Trab zu halten,
und Sie zu einem Meister der Datenverarbeitung machen. Was warten Sie noch?
Blättern Sie um und lassen Sie Ihren Trainer nicht warten …
Dieses Kapitel wird Sie bestimmt fit
machen!
Paul Barry, Python von Kopf bis Fuß, O´Reilly, ISBN 9783897213180
Der Inhalt
xiii
Code und Daten bündelnDie gewählte Datenstruktur sollte Ihren Daten entsprechen. Und diese Wahl kann erhebliche Auswirkungen auf Ihren Code haben. Listen und Sets,
so nützlich sie auch sein mögen, sind nicht das Einzige, was Python zu bieten hat. In
Pythons Dictionaries können Sie Ihre Daten für den schnellen Zugriff optimieren, indem
Sie statt Zahlen Namen mit Ihren Daten verknüpfen. Und wenn Pythons eingebaute
Datenstrukturen es nicht bringen, können Sie mit Pythons class-Anweisung Ihre
eigenen definieren. Dieses Kapitel zeigt Ihnen, wie das geht.
Eigene Datenobjekte
6Trainer Tim ist wieder da (mit einem neuen Dateiformat) 174
Mit einem Dictionary Daten verknüpfen 178
Bündeln Sie Code und Daten in einer Klasse 189
Eine Klasse definieren 190
Mit class Klassen definieren 191
Die Bedeutung von self 192
Das erste Argument jeder Methode ist self 193
Von Pythons eingebauten Listen erben 204
Trainer Tim ist beeindruckt 211
Ihr Python-Werkzeugkasten 212
Die Objekt- fabrik
Der Inhalt
xiv
7
Teilen ist gut 214
Sie können Ihr Programm ins Web bringen 215
Was muss Ihre Webapp tun? 218
Webapps mit MVC entwerfen 221
Die Daten modellieren 222
Die Schnittstelle entwerfen 226
Den Code strukturieren 234
Auf dem Webserver Programme ausführen 235
Die Sportlerliste anzeigen 236
Das schreckliche 404! 242
Ein weiteres CGI-Skript generieren 244
Zur Fehleridentifikation CGI-Tracking aktivieren 248
Eine kleine Änderung macht den Unterschied aus 250
Ihre Webapp ist ein Volltreffer! 252
Ihr Python-Werkzeugkasten 253
Die Teile zusammenfügenWebentwicklung
Früher oder später werden Sie Ihre Anwendung mit anderen teilen wollen. Es gibt viele Möglichkeiten, das zu tun. Bringen Sie Ihren Code auf PyPI, senden Sie
Rundmails aus, packen Sie Ihren Code auf eine CD oder einen USB-Stick oder installieren
Sie Ihr Programm einfach von Hand auf den Rechnern der Leute, die es brauchen. Klingt
nach einer Menge Arbeit … und langweiliger noch dazu. Und was ist, wenn Sie eine neue,
bessere Version Ihres Codes geschaffen haben? Was passiert dann? Wie machen Sie
das mit der Aktualisierung? Sehen wir den Tatsachen ins Gesicht: Das ist derart mühselig,
dass Ihnen wahrscheinlich eine Menge Entschuldigungen einfallen, um sich davor zu
drücken. Zum Glück ist das nicht notwendig: Erstellen Sie einfach eine Webanwendung.
Und wie dieses Kapitel zeigen wird, ist die Webentwicklung mit Python ein Kinderspiel.
Paul Barry, Python von Kopf bis Fuß, O´Reilly, ISBN 9783897213180
Der Inhalt
xv
8 Kleine GeräteDaten im Web bieten Ihnen die vielfältigsten Möglichkeiten. Es können nicht nur alle von überall her mit Ihrer Webapp interagieren, sie können das
auch noch mit den unterschiedlichsten Geräten tun: PCs, Laptops, Tablets und sogar
Handys. Und es sind nicht ausschließlich Menschen, die mit Ihrer Webapp interagieren:
Bots sind kleine Programme, die Webinteraktionen automatisieren und üblicherweise
nur Daten wollen, nicht das HTML, das der Mensch und sein Webbrowser benötigen.
In diesem Kapitel werden Sie Python auf dem Handy von Trainer Tim dafür verwenden,
um eine App zu schreiben, die mit den Daten Ihrer Webapp interagiert.
Mobile Apps
Die Welt wird kleiner 256
Trainer Tim nutzt Android 257
Machen Sie sich keine Gedanken über Python 2 259
Die Entwicklungsumgebung einrichten 260
SDK und Emulator konfigurieren 261
Android-Scripting installieren und konfigurieren 262
Python Ihrer SL4A-Installation hinzufügen 263
Python auf Android 264
Die Anforderungen Ihrer App definieren 266
Die SL4A Android-API 274
Unter Android aus einer Liste auswählen 278
Das CGI-Skript für die Sportlerdaten 281
Anscheinend haben sich die Daten geändert 284
JSON kann mit eigenen Datentypen nicht umgehen 285
Die App auf einem echten Gerät ausführen 288
AndFTP konfigurieren 289
Der Trainer ist von der Anwendung begeistert 290
Ihr Python-Werkzeugkasten 291
Der Inhalt
xvi
Ihre Laufzeiten-App – bekannt im ganzen Land 294
Mit einem Formular oder Dialog Daten annehmen 295
Eine Vorlage für ein HTML-Formular erstellen 296
Die Daten werden an Ihr CGI-Skript geliefert 300
Dateneingaben unter Android 304
Zeit, die Serverdaten zu aktualisieren 308
Konflikte vermeiden 309
Sie benötigen eine bessere Strategie zur Datenspeicherung 310
Nutzen Sie ein Datenbankmanagement-System 312
Python enthält SQLite 313
Pythons Datenbank-API nutzen 314
Die Datenbank-API als Python-Code 315
Etwas Datenbank-Design bringt eine Menge 316
Das Datenbankschema definieren 317
Wie sehen die Daten aus? 318
Die Daten aus dem Pickle in SQLite übertragen 321
Welcher Sportler erhält welche ID? 322
Die Zeitdaten einfügen 323
SQLite-Verwaltungswerkzeuge 326
SQLite in die Webapp integrieren 327
Sie brauchen immer noch die Liste mit den Namen 332
Sportler-Daten auf Basis der ID 333
Sie müssen auch die Android-App anpassen 342
Die SQLite-basierten Sportlerdaten aktualisieren 348
Der DJLV ist begeistert! 349
Ihr Python-Werkzeugkasten 350
Eingaben verarbeiten9Daten im Griff
Web und Handy sind nicht nur zur Datenanzeige geeignet. Beide sind auch ausgezeichnete Mittel, um Eingaben von Benutzern entgegenzunehmen. Natürlich
müssen Sie die Daten irgendwo unterbringen, nachdem Ihre Webapp sie erhalten hat. Und
worauf Ihre Wahl bei diesem »irgendwo« fällt, ist häufig dafür ausschlaggebend, ob eine Webapp
erweiterungsfähig ist oder nicht. In diesem Kapitel werden Sie Ihre Webapp so erweitern, dass sie
Daten aus dem Web akzeptiert (über einen Browser oder ein Android-Handy), und sich gleichzeitig
ansehen, wie man das Datenverwaltungssystem im Hintergrund verbessert.
Paul Barry, Python von Kopf bis Fuß, O´Reilly, ISBN 9783897213180
Der Inhalt
xvii
Ins Leben tretenDas Web ist ein ausgezeichneter Ort für Ihre App … bis es ernst wird. Früher oder später werden Sie den Hauptgewinn ziehen und Ihre Webapp wird ein rasender Erfolg.
Wenn das passiert, wird Ihre Webapp am Tag nicht mehr ein paar Mal, sondern tausend, vielleicht
zehntausend Mal oder gar noch öfter besucht. Werden Sie dann bereit sein? Wird Ihr Webserver die
Last bewältigen? Wie bringen Sie das in Erfahrung? Was wird es kosten? Wer wird es zahlen? Kann
Ihr Datenmodell Abermillionen von Datenelementen verkraften, ohne dabei ins Schneckentempo zu
fallen? Eine Webapp einzurichten und in Gang zu bringen, ist mit Python ein Kinderspiel, und heute,
dank der Google App Engine, kann man mit Python auch größeren Anforderungen gewachsen sein.
Blättern Sie um und finden Sie heraus wie.
Größere Dimensionen
10Walsichtungen überall 352
Die VKBFWW muss automatisieren 353
Ihre Webapp mit der Google App Engine aufbauen 354
Die App Engine installieren 355
Sicherstellen, dass die App Engine funktioniert 356
Die App Engine nutzt das MVC-Muster 359
Die Daten mit der App Engine modellieren 360
Ohne View bringt ein Modell wenig 363
Vorlagen in der App Engine verwenden 364
Djangos Formularvalidierungs-Framework 368
Ihr Formular prüfen 369
Die App Engine-Webapp steuern 370
Eingaben mit Optionen beschränken 376
Der »leere Bildschirm des Todes« 378
Die POST-Daten in der Webapp verarbeiten 379
Die Daten in den Datenspeicher stecken 380
Das »Robustheitsprinzip« nicht verletzen 384
Datum und Zeit in (fast) allen Formen akzeptieren 385
Anscheinend sind Sie noch nicht fertig 388
Manchmal macht eine winzige Änderung einen gewaltigen Unterschied ... 389
Die Google ID des Benutzers speichern 390
Die Webapp in die Cloud bringen 391
Die VKBFWW-Webapp ist aktiv! 394
Ihr Python-Werkzeugkasten 395
Der Inhalt
xviii
Welche Zeit ist für das nächste Rennen anzuvisieren? 398
Und was ist das Problem? 400
Beginnen wir mit den neuen Daten 401
Die einzelnen Zeiten als Dictionary speichern 407
Den Vorhersagecode analysieren 409
Benutzereingaben entgegennehmen 413
Eingaben führen zu Problemen ... 414
Nach dem besten Treffer suchen 416
Das Problem ist die Zeit 418
Das Zeit-zu-Sekunden-zu-Zeit-Modul 419
Die Zeit bleibt das Problem ... 422
Auf Android portieren 424
Ihre Android-App ist eine Dialogsammlung 425
Die App zusammensetzen ... 429
Ihre App ist ein Geschenk! 431
Ihr Python-Werkzeugkasten 432
Daten strukturieren11Komplexität bewältigen
Mit Python über bestimmte Problembereiche hinauswachsen. Ob es nun die Webentwicklung ist, das Datenbankmanagement oder mobile Apps, Python hilft
Ihnen, die Arbeit zu erledigen, indem es Ihrer Programmierlösung nicht in die Quere kommt.
Und dann gibt es andere Arten von Problemen: die, die nicht in einen bestimmten Bereich fallen.
Probleme, die selbst so speziell sind, dass Sie sie auf eine ganz andere, eben ganz spezielle
Weise betrachten müssen. Maßgeschneiderte Softwarelösungen für derartige Probleme sind
Pythons Paradedisziplin. Deswegen werden Sie in diesem letzten Kapitel Ihre Python-Fertigkei-
ten bis zum Äußersten strecken müssen, um die anstehenden Probleme zu lösen.
Paul Barry, Python von Kopf bis Fuß, O´Reilly, ISBN 9783897213180
Der Inhalt
xix
Die Top-Ten der Dinge, die wir nicht behandelt habenSie haben es weit gebracht.
Aber das Lernen von Python ist eine Beschäftigung, die nie endet. Je mehr Python-
Code Sie schreiben, desto mehr neue Möglichkeiten lernen Sie kennen, bestimmte
Dinge zu tun. Auch in neue Werkzeuge und Techniken werden Sie sich einarbeiten
müssen. Leider bietet ein Buch einfach nicht genug Platz, um alles aufzunehmen, was
Sie eventuell über Python wissen müssen. Deswegen finden Sie hier eine Liste der
zehn wichtigsten Dinge, die wir nicht behandelt haben, die Sie sich vielleicht aber als
Nächstes ansehen sollten.
Was übrig bleibt
i1. Eine »professionelle« IDE nutzen 436
2. Geltungsbereiche 437
3. Testen 438
4. Fortgeschrittene Spracheigenschaften 439
5. Reguläre Ausdrücke 440
6. Mehr zu Webframeworks 441
7. Objektrelationale Mapper und NoSQL 442
8. GUI-Programmierung 443
9. Was Sie vermeiden sollten 444
10. Andere Bücher 445
Dies ist ein A
uszug aus dem B
uch "Python von K
opf bis Fu&
szlig;", ISB
N 978-3-89721-318-0
http://ww
w.oreilly.de/catalog/hfpythonger/
Dieser A
uszug unterliegt dem U
rheberrecht. © O
’Reilly V
erlag 2011
Hier fängt ein neues Kapitel an 105
Ich bin etwas besorgt ... meine Daten sind nicht
so persistent, wie ich es mir wünschen würde.
Persistenz4
Daten in Dateien speichern
Es ist wunderbar, wenn man dateibasierte Daten verarbeiten kann. Aber was passiert mit Ihren Daten, wenn Sie fertig sind? Natürlich ist es am besten, Sie speichern
Ihre Daten in einer Datei auf der Festplatte und verschaffen sich damit die Möglichkeit, sie später
wieder nutzen zu können. Dass Sie Ihre im Speicher befindlichen Daten auf der Festplatte spei-
chern, ist das, worum es bei Persistenz geht. Python unterstützt die üblichen Werkzeuge zum
Schreiben von Dateien und bietet einige coole Möglichkeiten zur effizienten Speicherung von
Python-Daten. Blättern Sie um und beginnen wir, uns mit ihnen vertraut zu machen.
Paul Barry, Python von Kopf bis Fuß, O´Reilly, ISBN 9783897213180
Dies ist ein A
uszug aus dem B
uch "Python von K
opf bis Fu&
szlig;", ISB
N 978-3-89721-318-0
http://ww
w.oreilly.de/catalog/hfpythonger/
Dieser A
uszug unterliegt dem U
rheberrecht. © O
’Reilly V
erlag 2011
106 Kapitel 4
Ihre Arbeit speichern
Programme generieren DatenEs geschieht wirklich selten, dass ein Programm Daten aus einer Datei von der Festplatte liest, verarbeitet und dann die verarbeiteten Daten wegwirft. Üblicherweise speichern Programme die Daten, die sie verarbeiten, zeigen Ausgaben auf dem Bildschirm an oder übertragen Daten über ein Netzwerk.
DBMS
Ihre Daten sind bereit. Wohin soll ich sie
packen?
Tolle Ausgabe ... genau, was ich haben wollte.
Es gibt eine Reihe von Optionen für die Art der Festplattenspeicherung.
Bevor Sie lernen, was alles beachtet werden muss, wenn Daten auf die Festplatte geschrieben werden sollen, sollten wir die Daten aus dem letzten Kapitel verarbeiten, um herauszufinden, wer was gesagt hat.
Wenn das erledigt ist, werden wir etwas zu speichern haben.
Dies ist ein A
uszug aus dem B
uch "Python von K
opf bis Fu&
szlig;", ISB
N 978-3-89721-318-0
http://ww
w.oreilly.de/catalog/hfpythonger/
Dieser A
uszug unterliegt dem U
rheberrecht. © O
’Reilly V
erlag 2011
Sie sind hier 4 107
Persistenz
Code-MagnetenFügen Sie die Code-Magneten unten auf der Seite in den bestehenden Code ein, damit er die folgenden Anforderungen erfüllt:
1. Er soll eine leere Liste namens mann. erstellen.2. Er soll eine leere Liste namens anderer. erstellen.3. Fügen Sie eine Codezeile ein, die unerwünschten Leerraum aus der Variablen aussage entfernt.4. Geben Sie die Bedingungen und den Code an, der aussage auf Basis des Werts von rolle der entsprechenden Liste zuweist.5. Geben Sie die Listen (mann und anderer) auf dem Bildschirm aus.
aussage = aussage.strip()
print(anderer)
mann = [] anderer.append(aussage)
try:
daten = open('sketch.txt')
for zeile in daten:
try:
(rolle, aussage) = zeile.split(':', 1)
except ValueError:
pass
daten.close()
except IOError:
print('Datendatei nicht auffindbar!')
anderer = []
Hier sind die Magneten.
print(mann)
aussage = aussage.strip()
if rolle == 'Man':
anderer = []
mann.append(aussage)
mann = []
elif rolle == 'Other Man':
Paul Barry, Python von Kopf bis Fuß, O´Reilly, ISBN 9783897213180
Dies ist ein A
uszug aus dem B
uch "Python von K
opf bis Fu&
szlig;", ISB
N 978-3-89721-318-0
http://ww
w.oreilly.de/catalog/hfpythonger/
Dieser A
uszug unterliegt dem U
rheberrecht. © O
’Reilly V
erlag 2011
108 Kapitel 4
Verarbeiten und ausgeben
try:
daten = open('sketch.txt')
for zeile in daten:
try:
(rolle, aussage) = zeile.split(':', 1)
except ValueError:
pass
daten.close()
except IOError:
print('Datendatei nicht auffindbar!')
anderer.append(aussage)
if rolle == 'Man':
mann.append(aussage)
elif rolle == 'Other Man':
Code-Magneten, LösungSie sollten die Code-Magneten unten auf der Seite in den bestehenden Code einfügen, damit er die folgenden Anforderungen erfüllt:
1. Er soll eine leere Liste namens mann. erstellen.2. Er soll eine leere Liste namens anderer. erstellen.3. Fügen Sie eine Codezeile ein, die unerwünschten Leerraum aus der Variablen aussage entfernt.4. Geben Sie die Bedingungen und den Code an, der aussage auf Basis des Werts von rolle der entsprechenden Liste zuweist.5. Geben Sie die Listen (mann und anderer) auf dem Bildschirm aus.
(rolle, aussage) = zeile.split(':', 1)
aussage = aussage.strip()
print(mann)
mann = []
anderer = []
»mann« und »anderer« wird eine leere Liste zugewiesen.
Die »strip()«-Methode entfernt unerwünschten Leerraum aus einem String.
Der beschnittene String wird wieder sich selbst zugewiesen.
Je nachdem, wer was gesagt hat, wird eine der Listen aktualisiert.
Zum Abschluss werden die verarbeiteten Daten auf dem Bildschirm angezeigt.
»elif « heißt »else if«.
print(anderer)
Dies ist ein A
uszug aus dem B
uch "Python von K
opf bis Fu&
szlig;", ISB
N 978-3-89721-318-0
http://ww
w.oreilly.de/catalog/hfpythonger/
Dieser A
uszug unterliegt dem U
rheberrecht. © O
’Reilly V
erlag 2011
Sie sind hier 4 109
Persistenz
Laden Sie Ihren Code in IDLEs Editorfenster und testen Sie ihn, indem Sie F5 drücken. Denken Sie daran, dass Sie Ihr Programm in dem Ordner speichern müssen, in dem sketch.txt gespeichert ist.
Das ist der Code in IDLEs Editorfenster.
Und hier sehen Sie, was auf dem Bildschirm erscheint: der Inhalt der beiden Listen.
Es funktioniert wie erwartet.
Mit Pythons open()-BIF kann man Dateien doch sicher nicht nur zum
Lesen, sondern auch zum Schreiben öffnen, oder?
Ja, das kann man.
Wenn Sie Daten in einer Datei speichern müssen, brauchen Sie nur die open()-BIF.
PROBEFAHRT
Paul Barry, Python von Kopf bis Fuß, O´Reilly, ISBN 9783897213180
Dies ist ein A
uszug aus dem B
uch "Python von K
opf bis Fu&
szlig;", ISB
N 978-3-89721-318-0
http://ww
w.oreilly.de/catalog/hfpythonger/
Dieser A
uszug unterliegt dem U
rheberrecht. © O
’Reilly V
erlag 2011
110 Kapitel 4
Öffnen und Schließen
Eine Date i im Schreibmodus öffnenWenn Sie open() nutzen, um mit Dateien auf der Festplatte zu arbeiten, können Sie den zu ver-wendenden Zugriffsmodus angeben. Standardmäßig nutzt open() den Modus r (Lesen), diesen müssen Sie also nicht angeben. Wenn Sie eine Datei zum Schreiben öffnen möchten, nutzen Sie den Modus w:
datei = open("daten.out", "w")Das Daten-dateiobjekt
Der Name der zu schreibenden Datei.
Der zu verwendende Zugriffsmodus.
Standardmäßig nutzt die print()-BIF die Standardausgabe (also üblicherweise den Bildschirm) zur Ausgabe von Daten. Sollen die Daten stattdessen in eine Datei geschrieben werden, dann nutzen Sie das Argument file, um das zu verwendende Datendateiobjekt anzugeben:
print("Norwegian Blues stun easily.", file=datei)
Was in die Datei geschrieben wird Der Name des Datendateiobjekts, in das geschrieben werden soll.Wenn Sie fertig sind, dürfen Sie nicht vergessen, die Datei zu schließen, um
sicherzustellen, dass alle Daten auf die Festplatte geschrieben werden. Dies bezeichnet man als Flushing (Spülen) und ist sehr wichtig:
datei.close()Das ist beim Schreiben in eine Datei SEHR wichtig.
Wenn Sie den Zugriffsmodus w nutzen, öffnet Python die benannte Datei zum Schreiben. Wenn die Datei bereits besteht, wird ihr Inhalt geleert. Sollen Daten an eine Datei angehängt werden, nutzen Sie den Zugriffsmodus a. Wenn Sie eine Datei zum Lesen und Schreiben öffnen (ohne dass sie geleert wird) wollen, nutzen Sie w+. Versuchen Sie eine Datei zum Schreiben zu öffnen, die es noch nicht gibt, wird sie zunächst erstellt und dann zum Schreiben geöffnet.
Geek-Futter
Dies ist ein A
uszug aus dem B
uch "Python von K
opf bis Fu&
szlig;", ISB
N 978-3-89721-318-0
http://ww
w.oreilly.de/catalog/hfpythonger/
Dieser A
uszug unterliegt dem U
rheberrecht. © O
’Reilly V
erlag 2011
Sie sind hier 4 111
Persistenz
Am Ende Ihres Programms werden die verarbeiteten Daten mit der print()-BIF auf dem Bildschirm ausgegeben. Ändern Sie den Code, damit die Daten stattdessen in zwei Dateien auf der Festplatte gespeichert werden.
Nennen Sie die Dateien mann_daten.txt (für alles, was der Mann sagt) und anderer_daten.txt (für alles, was der andere Mann sagt). Denken Sie daran, die Dateien zu öffnen und zu schließen und Ihren Code mit try/except vor IOError zu schützen.
mann = []
anderer = []
try:
daten = open('sketch.txt')
for zeile in daten:
try:
(rolle, aussage) = zeile.split(':', 1)
aussage = aussage.strip()
if rolle == 'Man':
mann.append(aussage)
elif rolle == 'Other Man':
anderer.append(aussage)
except ValueError:
pass
daten.close()
except IOError:
print('Datendatei nicht auffindbar!')
print(mann, )
print(anderer, )
Los, probieren Sie es! Öffnen Sie hier die beiden Dateien.
Geben Sie die Dateien an, in die der »print()«-Aufruf schreiben soll.Denken Sie daran, die
Dateien zu schließen.
Verarbeiten Sie hier eventuelle Ausnahmen.
Spitzen Sie Ihren Bleistift
Paul Barry, Python von Kopf bis Fuß, O´Reilly, ISBN 9783897213180
Dies ist ein A
uszug aus dem B
uch "Python von K
opf bis Fu&
szlig;", ISB
N 978-3-89721-318-0
http://ww
w.oreilly.de/catalog/hfpythonger/
Dieser A
uszug unterliegt dem U
rheberrecht. © O
’Reilly V
erlag 2011
112 Kapitel 4
Auf Festplatte speichern
mann = []
anderer = []
try:
daten = open('sketch.txt')
for zeile in daten:
try:
(rolle, aussage) = zeile.split(':', 1)
aussage = aussage.strip()
if rolle == 'Mann':
mann.append(aussage)
elif rolle == 'Other Man':
anderer.append(aussage)
except ValueError:
pass
daten.close()
except IOError:
print('Datendatei nicht auffindbar!')
print(mann, )
print(anderer, )
Am Ende Ihres Programms werden die verarbeiteten Daten mit der print()-BIF auf dem Bildschirm ausgegeben. Sie sollten den Code so ändern, dass die Daten stattdessen in zwei Dateien auf der Festplatte gespeichert werden.
Sie sollten die Dateien mann_daten.txt (für alles, was der Mann sagt) und anderer_daten.txt (für alles, was der andere Mann sagt) nennen und daran denken, die Dateien zu öffnen und zu schließen und Ihren Code mit try/except vor IOError zu schützen.
try:mann_datei = open(‘mann_daten.txt’, ‘w’)
file=mann_dateifile=anderer_datei
print('Dateifehler.’)
anderer_datei = open(‘anderer_daten.txt’, ‘w’)
mann_datei.close()anderer_datei.close()
except IOError:
Dieser Code bleibt unverändert.
Haben Sie daran gedacht, Ihre Dateien im Schreibmodus zu öffnen?
Die beiden Dateien werden geöffnet und zwei Dateiobjekten zugewiesen.
Nutzen Sie die »print()«-BIF, um die angegebene Liste in der angegebenen Datei zu speichern.
Vergessen Sie nicht, BEIDE Dateien zu schließen.
Ein-/Ausgabeausnahmen werden verarbeitet, falls solche auftreten sollten.
LösungSpitzen Sie Ihren Bleistift
Dies ist ein A
uszug aus dem B
uch "Python von K
opf bis Fu&
szlig;", ISB
N 978-3-89721-318-0
http://ww
w.oreilly.de/catalog/hfpythonger/
Dieser A
uszug unterliegt dem U
rheberrecht. © O
’Reilly V
erlag 2011
Sie sind hier 4 113
Persistenz
PROBEFAHRTFühren Sie die Änderung durch, um die beiden print()-Aufrufe durch den neuen Ein-/Ausgabecode zu ersetzen. Führen Sie dann das Programm aus und prüfen Sie, ob die Dateien angelegt werden:
Wenn Sie Ihren Code ausführen, sehen Sie nur das: eine leere IDLE-Shell.
Vor Ausführung Ihres Programms befinden sich keine Datendateien im Ordner, nur Ihr Code.
Nach Ausführung Ihres Programms befinden sich zwei NEUE Dateien im Ordner.
Auch dieser Code funktioniert. Sie haben zwei Datendateien erstellt, die jeweils Daten aus einer der beiden Listen enthalten. Fahren Sie fort und öffnen Sie die Dateien in einem Texteditor, um sich zu vergewissern, dass sie die erwarteten Daten enthalten.
Überlegen Sie Folgendes ganz genau: Was passiert, mit Ihren Datendateien, wenn der zweite print()-Aufruf in Ihrem Code zu einem IOError führt?
Kopf-nuss
Paul Barry, Python von Kopf bis Fuß, O´Reilly, ISBN 9783897213180
Dies ist ein A
uszug aus dem B
uch "Python von K
opf bis Fu&
szlig;", ISB
N 978-3-89721-318-0
http://ww
w.oreilly.de/catalog/hfpythonger/
Dieser A
uszug unterliegt dem U
rheberrecht. © O
’Reilly V
erlag 2011
114 Kapitel 4
Dateien schließen
Nach e iner Ausnahme ble iben Date ien offen!Wenn Sie nur Daten aus Dateien lesen, sind IOError nervig, aber nur selten gefährlich, da die Daten immer noch in der Datei sind, auch wenn Sie Probleme haben, an diese heranzukommen.
Wenn Sie Daten in Dateien schreiben, sieht die Sache anders aus: Erhalten Sie einen IOError, bevor eine Datei geschlossen ist, könnten die geschriebenen Daten beschädigt werden – was Sie eventuell erst feststellen, nachdem das Kind in den Brunnen gefallen ist.
try:
mann_datei = open('mann_daten.txt', 'w') anderer_datei = open('anderer_daten.txt', 'w')
print(mann, file=mann_datei)
print(anderer, file=anderer_datei)
mann_datei.close()
anderer_datei.close()
except IOError:
print('Dateifehler.')
Bumm!
Ok.OK
OKOK
OKOK
Nicht OK!!
Diese beiden Codezeilen werden NICHT ausgeführt.
Der Code zur Ausnahmeverbeitung erfüllt seine Aufgabe, aber jetzt haben Sie eine Situation, in der Ihre Daten eventuell beschädigt sind. Das kann nicht gut sein.
Deswegen brauchen Sie eine Möglichkeit, Code unabhängig davon auszuführen, ob ein IOError aufgetreten ist oder nicht. In Ihrem Code soll daher sichergestellt werden, dass die Dateien grundsätzlich geschlossen werden, egal was passiert.
Dies ist ein A
uszug aus dem B
uch "Python von K
opf bis Fu&
szlig;", ISB
N 978-3-89721-318-0
http://ww
w.oreilly.de/catalog/hfpythonger/
Dieser A
uszug unterliegt dem U
rheberrecht. © O
’Reilly V
erlag 2011
Sie sind hier 4 115
Persistenz
try mit f inally er weiternWenn Sie sich in einer Lage befinden, in der bestimmter Code immer ausgeführt werden muss, egal ob Fehler eintreten oder nicht, fügen Sie Ihrer try-Anweisung eine finally-Suite hinzu:
try:
mann_datei = open('mann_daten.txt', 'w')
anderer_datei = open('anderer_daten.txt', 'w')
print(mann, file=mann_datei)
print(anderer, file=anderer_datei)
except IOError:
print('Dateifehler.')
finally:
mann_datei.close()
anderer_datei.close()
Hier gibt es keine Änderungen, außer …
… dass die »close()«-Aufrufe hierhin verschoben wurden.
Wenn keine Laufzeitfehler auftreten, wird der Code in der finally-Suite ausgeführt. Tritt ein IOError auf, wird die except-Suite ausgeführt und anschließend die finally-Suite.
Ganz gleich, was passiert, der Code in der Finally-Suite wird immer ausgeführt.
Wenn Sie den Code zum Schließen der Dateien in die finally-Suite verschieben, reduzieren Sie die Gefahr einer möglichen Datenbeschädigung.
Dies ist eine gewaltig Verbesserung, weil Sie jetzt sicherstellen, dass die Dateien ordentlich geschlossen werden (selbst wenn Schreibfehler auftreten).
Aber was ist mit diesen Fehlern?
Wie finden Sie Einzelheiten zu solchen Fehlern heraus?
Paul Barry, Python von Kopf bis Fuß, O´Reilly, ISBN 9783897213180
Dies ist ein A
uszug aus dem B
uch "Python von K
opf bis Fu&
szlig;", ISB
N 978-3-89721-318-0
http://ww
w.oreilly.de/catalog/hfpythonger/
Dieser A
uszug unterliegt dem U
rheberrecht. © O
’Reilly V
erlag 2011
116 Kapitel 4
Keine dummen Fragen
F: Das ist ja interessant. Als Sie aus den Daten in aussage den unerwünschten Leerraum entfernt haben, haben Sie das Er-gebnis wieder der Variablen aussage zugewiesen. Der Aufruf von strip() auf aussage hat doch sicher den referenzierten String geändert?
A: Nein, das geschieht nicht. In Python sind Strings unveränder-lich und das bedeutet, dass ein String nachdem er einmal erstellt ist, nicht mehr verändert werden kann.
F: Aber Sie haben doch den String aussage geändert, indem Sie unerwünschten Leerraum entfernten?
A: Jein. Tatsächlich passiert Folgendes: Als strip() auf dem String aussage aufgerufen wurde, wurde ein neuer String erstellt, aus dem der Leerraum an Anfang und Ende entfernt wurde. Der neue String wird dann aussage zugewiesen, wobei die zuvor referenzierten Daten ersetzt werden. Im Prinzip ist das so, als hätten Sie aussage geändert, obwohl die referenzierten Daten eigentlich vollständig ersetzt wurden.
F: Und was passiert mit den ersetzten Daten?
A: Pythons eingebaute Speicherverwaltungstechnologie holt sich das von ihnen eingenommene RAM zurück und stellt es Ihrem Programm wieder zur Verfügung, es sei denn, ein anderes Python-Datenobjekt verweist weiterhin auf diesen String.
F: Tut mir Leid. Das verstehe ich nicht.
A: Es ist möglich , dass eine andere Variable auf das Datenobjekt verweist, das auch aussage referenziert. Nehmen wir beispielswei-se an, Sie haben Code, der zwei Variablen enthält, die beide auf den String »Flying Circus« verweisen. Dann entschließen Sie sich, dass eine der Variablen nur GROSSBUCHSTABEN enthält, und rufen auf ihr die Methode upper() auf. Der Python Interpreter nimmt dann eine Kopie des Strings, wandelt ihn in Großbuchstaben um und liefert ihn zurück. Anschließend können Sie die Daten in Großbuchstaben wieder der Variablen zuweisen, die zuvor die alten Daten enthielt.
F: Und die ursprünglichen Daten können sich nicht ändern, weil es eine andere Variable gibt, die auf sie verweist?
A: Genau. Deswegen sind Strings unveränderlich – weil Sie nie wissen, ob nicht noch andere Variablen auf einen bestimmten String verweisen.
F: Aber Python kann doch sicher ermitteln, wie viele Variablen auf einen bestimmten String verweisen?
A: Das geschieht auch – allerdings nur für die Garbage-Collection. Enthält Ihr Code eine Zeile wie print('Flying Circus'), zeigt keine Variable auf den String (er wird also von keiner einzigen Referenzzählung gezählt), aber er ist dennoch ein gültiges Stringob-jekt (auf das eine Variable zeigen könnte), dessen Daten unter keinen Umständen geändert werden können.
F: Python-Variablen enthalten die ihnen zugewiesenen Daten also nicht unmittelbar?
A: Das ist richtig. Python-Variablen enthalten Referenzen auf Datenobjekte. Das Datenobjekt enthält die Daten und, weil es sein kann, dass Stringobjekte an vielen Stellen im Code genutzt werden, ist es sicherer, dass alle Strings unveränderlich sind, damit keine hässlichen Nebeneffekte auftreten.
F: Ist es nicht ein erheblicher Nachteil, dass man Strings nicht »vor Ort« ändern kann?
A: Nein, eigentlich nicht. Haben Sie sich einmal daran gewöhnt, wie Strings funktionieren, ist das kein großes Problem mehr. Sie werden feststellen, dass Ihnen in der Praxis hierdurch nur selten Probleme entstehen.
F: Gibt es in Python noch weitere unveränderliche Typen?
A: Ein paar. Zum einen ist da das Tupel, eine unveränderliche Liste, und auch alle Zahltypen sind unveränderlich.
F: Woher weiß ich, wann etwas unveränderlich ist? Muss ich das auswendig lernen?
A: Keine Sorge: Sie werden es erfahren. Wenn Sie versu-chen, einen unveränderlichen Wert zu ändern, löst Python einen TypeError-Fehler aus.
F: Natürlich: Es wird eine Ausnahme ausgelöst. Die scheinen in Python ja allgegenwärtig zu sein?
A: Ja. Ausnahmen gehören zum Lauf der Welt.
Es gibt keineDummen Fragen
Dies ist ein A
uszug aus dem B
uch "Python von K
opf bis Fu&
szlig;", ISB
N 978-3-89721-318-0
http://ww
w.oreilly.de/catalog/hfpythonger/
Dieser A
uszug unterliegt dem U
rheberrecht. © O
’Reilly V
erlag 2011
Sie sind hier 4 117
Persistenz
Den Typ des Fehlers zu kennen, re icht nichtWenn bei einer Datei-Ein-/Ausgabefehler auftreten, zeigt Ihr Code eine allgemeine »Dateifehler«-Meldung an. Diese ist zu allgemein. Wie bringen Sie in Erfahrung, was tatsächlich geschehen ist?
Vielleicht liegt es daran, dass die Datei nicht
geöffnet werden kann?
Es könnte auch sein, dass die Datei zwar geöffnet,
aber nicht in sie geschrieben werden kann?
Oder es könnte ein Berechtigungsfehler sein,
oder vielleicht ist die Festplatte voll?
Wer weiß?
Nun, es ist so, dass der Python-Interpreter es weiß … und teilt diese Informationen mit Ihnen, wenn Sie ihn höflich darum bitten.
Wenn zur Laufzeit ein Fehler auftritt, löst Python eine Ausnahme eines bestimmten Typs aus (z.B. einen IOError, ValueError und so weiter). Außerdem erstellt Python ein Exception-Objekt, das als Argument an die except-Suite übergeben wird.
Nutzen wir IDLE, um zu sehen, wie das funktioniert.
Paul Barry, Python von Kopf bis Fuß, O´Reilly, ISBN 9783897213180
Dies ist ein A
uszug aus dem B
uch "Python von K
opf bis Fu&
szlig;", ISB
N 978-3-89721-318-0
http://ww
w.oreilly.de/catalog/hfpythonger/
Dieser A
uszug unterliegt dem U
rheberrecht. © O
’Reilly V
erlag 2011
118 Kapitel 4
IDLE-Sitzung
Schauen wir uns an, was passiert, wenn Sie eine Datei öffnen, die es nicht gibt, z.B. eine Datei namens nicht_da.txt. Geben Sie den folgenden Code in der IDLEs-Shell ein:
>>> try:
daten = open('nicht_da.txt')
print(daten.readline(), end='')
except IOError:
print('Dateifehler')
finally:
daten.close()
Dateifehler
Traceback (most recent call last):
File "<pyshell#8>", line 7, in <module>
daten.close()
NameError: name 'daten' is not defined
Hier ist Ihre Fehlermeldung, aber …
… was ist das?!? Eine weitere Ausnahme wurde ausgelöst und hat zum Abbruch Ihres Codes geführt.
Da es die Datei nicht gibt, wurde das Dateiobjekt daten nicht erstellt. Deswegen ist es nachfolgend nicht möglich, close() darauf aufzurufen. Beim Versuch wird ein NameError ausgelöst. Das könnten wir beheben, indem wir in finally eine kleine Prüfung einbauen, um sicherzustellen, dass es den Namen daten gibt, bevor wir close() aufrufen. Die BIF locals() liefert eine Sammlung aller im aktuellen Geltungsbereich definierten Namen. Nutzen wir diese BIF, um close() nur dann aufzurufen, wenn das sicher möglich ist:
finally:
if 'daten' in locals():
daten.close()
Dateifehler Diesmal gibt es keine weitere Ausnahme, nur Ihre Fehlermeldung.
Hier suchen Sie in der von locals() gelieferten Sammlung nach dem String daten. Finden Sie ihn, dann können Sie davon ausgehen, dass die Datei erfolgreich geöffnet wurde und Sie close() sicher aufrufen können.
Wenn ein anderer Fehler auftritt (es könnte ja etwas Schreckliches passieren, wenn der Code die print()-BIF aufruft), fängt Ihr Code zur Ausnahmeverarbeitung den Fehler ab, zeigt Ihre »Dateifehler«-Meldung an und schließt dann die geöffnete Datei.
Aber Sie wissen nun immer noch nicht, was tatsächlich für den Fehler verantwortlich ist.
Der »in«-Operator prüft auf Vorhandensein.
Das ist nur der Codeteil, der geändert wird. Drücken Sie Alt-P, um Ihren Code in der IDLE-Shell zu bearbeiten.
Eine IDLE-Sitzung
Dies ist ein A
uszug aus dem B
uch "Python von K
opf bis Fu&
szlig;", ISB
N 978-3-89721-318-0
http://ww
w.oreilly.de/catalog/hfpythonger/
Dieser A
uszug unterliegt dem U
rheberrecht. © O
’Reilly V
erlag 2011
Sie sind hier 4 119
Persistenz
Wenn eine Ausnahme ausgelöst und von Ihrer except-Suite verarbeitet wird, übergibt der Python-Interpreter der Suite ein Exception-Objekt. Eine kleine Änderung macht dieses Objekt über einen Bezeichner für Ihren Code verfügbar:
except IOError as err:
print('Dateifehler: ' + err)
Traceback (most recent call last):
File "<pyshell#18>", line 5, in <module>
print('Dateifehler:' + err)
TypeError: Can't convert 'IOError' object to str implicitly
Geben Sie Ihrem Exception-Objekt einen Namen …… nutzen Sie es dann als Teil Ihrer Fehlermeldung.
Mist! Schon wieder eine Ausnahme. Diesmal ist es ein »TypeError«.
Diesmal ist Ihre Fehlermeldung überhaupt nicht aufgetaucht. Es stellt sich heraus, dass Exception-Objekte und Strings nicht kompatibel sind. Deswegen taucht ein anderes Problem auf, wenn Sie versuchen, das eine mit dem anderen zu verbinden. Sie können aber mit der str()-BIF Exception-Objekte in Strings umwandeln (oder casten):
except IOError as err:
print('Dateifehler: ' + str(err))
Dateifehler: [Errno 2] No such file or directory: 'nicht_da.txt'
Nutzen Sie die »str()«-BIF, um das Exception-Objekt dazu zu bringen, dass es sich wie ein String verhält.
Und jetzt erhalten Sie eine spezi-fische Fehlermeldung, die Ihnen genau mitteilt, was schiefgelaufen ist.
Natürlich führt diese zusätzlich Logik dazu, dass die eigentliche Bedeutung des Codes verdeckt wird.
Wäre es nicht wunderbar, wenn es eine Möglichkeit gäbe, diese
Mechanismen zu nutzen, ohne dabei den Code zu überfrachten? Aber
das ist sicher nur ein Traum ...
Wenn Sie aber versuchen, den Code nach dieser Änderung auszuführen, wird eine andere Ausnahme ausgeführt:
Nachdem Sie diese letzte Änderung vorgenommen haben, verhält sich der Code genau, wie Sie es erwarten:
Paul Barry, Python von Kopf bis Fuß, O´Reilly, ISBN 9783897213180
Dies ist ein A
uszug aus dem B
uch "Python von K
opf bis Fu&
szlig;", ISB
N 978-3-89721-318-0
http://ww
w.oreilly.de/catalog/hfpythonger/
Dieser A
uszug unterliegt dem U
rheberrecht. © O
’Reilly V
erlag 2011
120 Kapitel 4
Nehmen Sie with
Nutzen Sie with, um mit Date ien zu arbeitenWeil die Verwendung des try/except/finally-Musters so verbreitet ist, wenn man mit Dateien arbeitet, bietet Python Ihnen eine Anweisung, die einige der Details verdeckt. Die with-Anweisung kann den Code, den Sie der bei der Arbeit mit Dateien schreiben müssen, drastisch reduzieren, weil sie keine finally-Suite einbauen müssen, um das Schließen eventuell geöffneter Dateien abzuwickeln. Schauen wir uns die Sache einmal:
try:
daten = open('its.txt', "w")
print("Es ist ...", file=daten)
except IOError as err:
print('Dateifehler: ' + str(err))
finally:
if 'daten' in locals():
daten.close()
try:
with open('its.txt', "w") as daten:
print("Es ist ...", file=daten)
except IOError as err:
print('Dateifehler: ' + str(err))
Das ist das übliche »try/except/finally«-Muster.
»with« macht das »finally« überflüssig.
Wenn Sie with nutzen, müssen Sie sich keine Gedanken mehr über das Schließen geöffneter Dateien machen, da sich der Python-Interpreter automatisch darum kümmert. Der with-Code rechts hat die gleiche Funktion wie der auf der linken Seite. Wir bei den Von Kopf bis Fuß-Labs wissen, welches Verfahren wir vorziehen.
Die with-Anweisung nutzt eine Python-Technologie, die als das Context Management Protokoll bezeichnet wird.
Geek-Futter
Dies ist ein A
uszug aus dem B
uch "Python von K
opf bis Fu&
szlig;", ISB
N 978-3-89721-318-0
http://ww
w.oreilly.de/catalog/hfpythonger/
Dieser A
uszug unterliegt dem U
rheberrecht. © O
’Reilly V
erlag 2011
Sie sind hier 4 121
Persistenz
Nehmen Sie sich Ihren Bleistift und schreiben Sie diesen try/except/finally-Code so um, dass er stattdessen with nutzt. Hier ist der Code, wie er nach Hinzufügung der erforderlichen finally-Suite aussieht:
try:
mann_datei = open('mann_daten.txt', 'w')
anderer_datei = open('anderer_daten.txt', 'w')
print(mann, file=mann_datei)
print(anderer, file=anderer_datei)
except IOError as err:
print('Dateifehler: ' + str(err))
finally:
if 'mann_datei' in locals():
mann_datei.close()
if 'anderer_datei' in locals():
anderer_datei.close()
Notieren Sie hier Ihren »with«-Code.
Spitzen Sie Ihren Bleistift
Paul Barry, Python von Kopf bis Fuß, O´Reilly, ISBN 9783897213180
Dies ist ein A
uszug aus dem B
uch "Python von K
opf bis Fu&
szlig;", ISB
N 978-3-89721-318-0
http://ww
w.oreilly.de/catalog/hfpythonger/
Dieser A
uszug unterliegt dem U
rheberrecht. © O
’Reilly V
erlag 2011
122 Kapitel 4
Kein finally
Sie sollten sich Ihren Bleistift nehmen und diesen try/except/finally-Code so umschreiben, dass er stattdessen with nutzt. So sah der Code nach Hinzufügung der erforderlichen finally-Suite aus:
try:
mann_datei = open('mann_daten.txt', 'w')
anderer_datei = open('anderer_daten.txt', 'w')
print(mann, file=mann_datei)
print(anderer, file=anderer_datei)
except IOError as err:
print('Dateifehler: ' + str(err))
finally:
if 'mann_datei' in locals():
mann_datei.close()
if 'anderer_datei' in locals():
anderer_datei.close()
try: with open(‘mann_daten.txt', ‘w') as mann_datei: print(man, file=mann_datei) with open(‘anderer_daten.txt', ‘w') as anderer_datei: print(anderer, file=anderer_datei)except IOError as err: print(‘Dateifehler: ' + str(err))
with open('mann_daten.txt', 'w') as mann_datei, open('anderer_daten.txt’, 'w’) as anderer_datei: print(man, file=mann_datei) print(anderer, file=anderer_datei)
Der Code wird mit »with«-Anweisungen umgeschrieben, damit das »finally« überflüssig wird.
Oder kombinieren Sie die beiden »open()«-Aufrufe
zu einer »with«-Anweisung.Beachten Sie das Komma.
LösungSpitzen Sie Ihren Bleistift
Dies ist ein A
uszug aus dem B
uch "Python von K
opf bis Fu&
szlig;", ISB
N 978-3-89721-318-0
http://ww
w.oreilly.de/catalog/hfpythonger/
Dieser A
uszug unterliegt dem U
rheberrecht. © O
’Reilly V
erlag 2011
Sie sind hier 4 123
Persistenz
PROBEFAHRTFügen Sie den with-Code Ihrem Programm hinzu und vergewissern Sie sich, dass die Funktion wie erwartet funktioniert. Löschen Sie die beiden Datendateien, die Sie mit der letzten Version Ihres Programms erstellt haben, laden Sie Ihren neuesten Code in IDLE und lassen Sie ihn laufen.
In der IDLE-Shell erscheint kein Fehler. Das zeigt uns, dass das
Programm erfolgreich ausgeführt wurde.
Wenn Sie in Ihrem Ordner nachsehen, sollten die beiden Dateien wieder vorhanden sein. Schauen wir uns den Inhalt der beiden Dateien in einem Texteditor an (oder nutzen Sie IDLE).
Das sagte der Mann.
Das sagte der andere Mann.
Sie haben die Listen in zwei Dateien gespeichert, die das enthalten, was der Mann sagte, bzw. das, was der Andere Mann sagte. Ihr Code ist jetzt so gut, dass er mit allen Ausnahmen klarkommt, mit denen Python oder Ihr Betriebssystem ihn konfrontieren könnten.
Gut gemacht. Die Sache nimmt nun wirklich Form an.
Paul Barry, Python von Kopf bis Fuß, O´Reilly, ISBN 9783897213180
Dies ist ein A
uszug aus dem B
uch "Python von K
opf bis Fu&
szlig;", ISB
N 978-3-89721-318-0
http://ww
w.oreilly.de/catalog/hfpythonger/
Dieser A
uszug unterliegt dem U
rheberrecht. © O
’Reilly V
erlag 2011
124 Kapitel 4
Ungeeignete Formate
Standardformate sind für Date ien ungee ignetObwohl Ihre Daten in einer Datei gespeichert sind, ist das Format nicht sonderlich nützlich. Experi-mentieren wir etwas in der IDLE-Shell, um uns anzusehen, welche Auswirkungen das haben kann.
Nutzen Sie with, um Ihre Datendateien zu öffnen und eine Zeile daraus anzuzeigen:
>>> with open('mann_daten.txt') as mdd:
print(mdd.readline())
['Is this the right room for an argument?', "No you haven't!", 'When?', "No you didn't!", "You didn't!", 'You did not!', 'Ah! (taking out his wallet and paying) Just the five minutes.', 'You most certainly did not!', "Oh no you didn't!", "Oh no you didn't!", "Oh look, this isn't an argument!", "No it isn't!", "It's just contradiction!", 'It IS!', 'You just contradicted me!', 'You DID!', 'You did just then!', '(exasperated) Oh, this is futile!!', 'Yes it is!']
Uff ! Es scheint, als sei Ihre Liste beim Speichern von print() in einen String umgewandelt worden. Ihr experimenteller Code liest eine einzige Datenzeile aus der Datei und gibt die gesamten Daten als einen großen Texthappen aus … soviel also dazu, dass Ihr Code Listendaten speichert.
Wie gehen Sie mit diesem Problem um?
Hinweis: Sie müssen die Datei nicht schließen, das erledigt »with« für Sie.
Standardmäßig gibt print() Ihre Daten in einem Format aus, dass nachahmt, wie Ihre Listendaten tatsächlich vom Python-Interpreter gespeichert werden. Die resultierende Ausgabe ist eigentlich nicht zur Weiterverarbeitung gedacht … ihr eigentlicher Zweck besteht darin, Ihnen, dem Python-Programmierer, zu zeigen, wie diese Listendaten im Speicher »aussehen«.
Eine IDLE-Sitzung
Geek-Futter
Dies ist ein A
uszug aus dem B
uch "Python von K
opf bis Fu&
szlig;", ISB
N 978-3-89721-318-0
http://ww
w.oreilly.de/catalog/hfpythonger/
Dieser A
uszug unterliegt dem U
rheberrecht. © O
’Reilly V
erlag 2011
Sie sind hier 4 125
Persistenz
Vielleicht könnte ich entsprechenden Parsing-Code schreiben, der das von »print()« genutzte »interne Format«
übersetzt. Das sollte eigentlich nicht zu viel Zeit in Anspruch nehmen ...
Vielleicht sollte ich mal einen Blick auf die Alternativen zu »print()« für die Formatierung von Daten vor dem
Speichern in einer Datei werfen? Das ist bestimmt lohnenswert.
Die Daten in der Datei zu parsen, ist eine Möglichkeit … obwohl das bei den ganzen eckigen Klammern, Anführungszeichen und Kommas sicher kein Zuckerschlecken ist. Das Schreiben des erforderlichen Codes, ist sicher machbar, aber es wäre eine ganze Menge Aufwand und das nur, um gespeicherte Daten wieder einzulesen ...
Lägen die Daten in einem leichter zu verarbeitenden Format vor, dann wäre die Aufgabe natürlich leichter. Vielleicht wäre es also gar nicht so schlecht, wenn wir uns auch mit der zweiten Überlegung genauer beschäftigen?
Fällt Ihnen eine Funktion ein, die wir in diesem Buch bereits erstellt haben, die hier nützlich sein könnte?
Kopf- nuss
Paul Barry, Python von Kopf bis Fuß, O´Reilly, ISBN 9783897213180
Dies ist ein A
uszug aus dem B
uch "Python von K
opf bis Fu&
szlig;", ISB
N 978-3-89721-318-0
http://ww
w.oreilly.de/catalog/hfpythonger/
Dieser A
uszug unterliegt dem U
rheberrecht. © O
’Reilly V
erlag 2011
126 Kapitel 4
Angepasste Ausgabe
Warum modif izieren wir nicht print_lv l()?Erinnern Sie sich an unsere nette print_lvl()-Funktion aus Kapitel 2, die eine Liste (oder Liste mit Listen) zeilenweise auf dem Bildschirm anzeigt, wobei verschachtelte Listen bei Bedarf eingerückt werden konnten?
Diese Funktionalität klingt eigentlich genau richtig! Hier ist der Code aus dem Modul schachtler.py (das Sie zuletzt am Ende von Kapitel 2 gesehen haben):
Dieser Code gibt Ihre Daten aktuell auf dem Bildschirm aus.
Es sollte eigentlich recht unproblematisch sein, diesen Code so anzupassen, dass er in eine Datei anstatt auf den Bildschirm schreibt (der auch die Standardausgabe heißt). Dann können Sie Ihre Daten in einem besser nutzbaren Format speichern.
Standardausgabe: Der Ort an den Ihr Code standardmäßig Ausgaben schreibt, wenn die »print()«-BIF genutzt wird.
Üblicherweise ist das der Bildschirm. In Python verweist »sys.stdout« auf die Standardausgabe und kann aus dem »sys«-Modul der Standardbibliothek importiert werden.
Vorsicht, Schulwissen!
Dies ist ein A
uszug aus dem B
uch "Python von K
opf bis Fu&
szlig;", ISB
N 978-3-89721-318-0
http://ww
w.oreilly.de/catalog/hfpythonger/
Dieser A
uszug unterliegt dem U
rheberrecht. © O
’Reilly V
erlag 2011
Sie sind hier 4 127
Persistenz
Fügen wir unserer print_lvl()-Funktion ein drittes Argument hinzu, das den Ort angibt, an den die Daten geschrieben werden sollen. Denken Sie daran, dem Argument den Standardwert sys.stdout zuzuweisen, damit weiterhin auf den Bildschirm geschrieben wird, wenn beim Aufruf der Funktion kein Dateiargument angegeben wird. Ergänzen Sie in den Lücken die Daten zu Ihrem neuen Argument. (Hinweis: Um Platz zu sparen, wurden in diesen Code die Kommentare entfernt. Sie sollten allerdings daran denken, die Kommentare in schachtler.py zu aktualisieren, nachdem Sie Ihren Code geändert haben.)
1
def print_lvl(liste, einzug=False, ebene=0, ):
for element in liste:
if isinstance(element, list):
print_lvl(element, einzug, ebene+1, )
else:
if einzug:
for tab in range(ebene):
print("\t", end='', )
print(element, )
Was muss mit dem Code in der with-Anweisung geschehen, wenn Ihnen die verbesserte print_lvl()-Funktion zur Verfügung steht?
2
Geben Sie die Namen der Module an, die Sie in Ihr Programm importieren müssen, um die Verbesserungen an print_lvl() zu unterstützen.
3
Übung
Paul Barry, Python von Kopf bis Fuß, O´Reilly, ISBN 9783897213180
Dies ist ein A
uszug aus dem B
uch "Python von K
opf bis Fu&
szlig;", ISB
N 978-3-89721-318-0
http://ww
w.oreilly.de/catalog/hfpythonger/
Dieser A
uszug unterliegt dem U
rheberrecht. © O
’Reilly V
erlag 2011
128 Kapitel 4
Ihre Funktion erweitern
Sie sollten print_lvl() ein drittes Argument hinzufügen, das den Ort angibt, an den die Daten geschrieben werden sollen. Sie sollten darauf achten, dem Argument den Standardwert sys.stdout zuzuweisen, damit weiterhin auf den Bildschirm geschrieben wird, wenn beim Aufruf der Funktion kein Dateiargument angegeben wird. Sie sollten in den Lücken die Daten zu Ihrem neuen Argument ergänzen. (Hinweis: Um Platz zu sparen, wurden in diesen Code die Kommentare entfernt. Sie sollten allerdings daran denken, die Kommentare im schachtler.py zu aktualisieren, nachdem Sie Ihren Code geändert haben.)
1
def print_lvl(liste, einzug=False, ebene=0, ):
for element in liste:
if isinstance(element, list):
print_lvl(element, einzug, ebene+1, )
else:
if einzug:
for tab in range(ebene):
print("\t", end='', )
print(element, )
Was muss mit dem Code in der with-Anweisung geschehen, wenn Ihnen die verbesserte print_lvl()-Funktion zur Verfügung steht?
2
Geben Sie die Namen der Module an, die Sie in Ihr Programm importieren müssen, um die Verbesserungen an print_lvl() zu unterstützen.
3
dat=sys.stdout
dat
file=datfile=dat
Der Code muss so angepasst werden, dass er statt der»print()«-BIF die Funktion »print_lvl()« aufruft.
Das Programm muss das verbesserte Schachtler-Modul importieren.
Hinweis: Die Signatur hat sich geändert.
Die beiden »print()«-Aufrufe werden so angepasst, dass das neue Argument genutzt wird.
Das vierte Argument wird ergänzt und ein Standardwerd angegeben.
lösung zur Übung
Dies ist ein A
uszug aus dem B
uch "Python von K
opf bis Fu&
szlig;", ISB
N 978-3-89721-318-0
http://ww
w.oreilly.de/catalog/hfpythonger/
Dieser A
uszug unterliegt dem U
rheberrecht. © O
’Reilly V
erlag 2011
Sie sind hier 4 129
Persistenz
PROBEFAHRTBevor Sie den Code testen können, müssen Sie Folgendes tun: 1. Nehmen Sie die erforderlichen Änderungen am schachtler-Modul vor und installieren Sie es in Ihrer Python-Umgebung (siehe Kapitel 2). Sie können es zusätzlich auch auf PyPI hochladen. 2. Ändern Sie Ihr Programm so, dass es schachtler importiert und in der with-Anweisung print_lvl() anstelle von print() nutzt. Hinweis: Ihr print_lvl()-Aufruf sollte so aussehen: print_lvl(mann, dat=mann_datei).Lassen Sie Ihre Programm zum Test laufen, wenn Sie bereit sind, und schauen Sie sich an, was passiert:
Schauen wir uns an, wie der Inhalt der Dateien jetzt aussieht.
Wie zuvor gibt es keine Ausgabe auf dem Bildschirm.
Jetzt kann man lesen, was der Mann sagte.
Und hier ist das, was der andere Mann sagte.
Das sieht gut aus. Durch die Verbesserung des schachtler-Moduls haben wir unserem Programm die Möglichkeit gegeben, Listendaten in lesbarer Form zu speichern. Das ist doch erheblich augenfreundlicher.
Aber erleichtert es auch das Wiedereinlesen der Daten?
Paul Barry, Python von Kopf bis Fuß, O´Reilly, ISBN 9783897213180
Dies ist ein A
uszug aus dem B
uch "Python von K
opf bis Fu&
szlig;", ISB
N 978-3-89721-318-0
http://ww
w.oreilly.de/catalog/hfpythonger/
Dieser A
uszug unterliegt dem U
rheberrecht. © O
’Reilly V
erlag 2011
130 Kapitel 4
Zerbrechlicher Code
Moment ... haben wir nicht schon einmal an diesem Punkt gestanden? Wir haben doch schon Code geschrieben, der Zeilen aus
einer Datendatei liest und in Listen steckt ... gefällt es Ihnen, sich im Kreis zu drehen?!?
Gut beobachtet.Das Problem hat große Ähnlichkeit mit dem, vor dem wir zu Anfang dieses Kapitels standen. Sie haben Textzeilen in einer Datei auf der Festplatte, die Sie verarbeiten müssen. Der eigentliche Unterschied ist der, dass nicht nur eine Datei, sondern gleich zwei Dateien verarbeitet werden müssen.
Sie wissen jetzt, wie man Code zur Verarbeitung der neuen Dateien schreibt. Aber Code wie dieser ist immer nur für das Format geeignet, für das er bei einem spezifischen Problem entworfen wurde. Das ist ein zerbrechliches Verfahren: Ändert sich das Datenformat, muss sich auch Ihr Code ändern.
Fragen Sie sich selbst: Ist es das wert?
Dies ist ein A
uszug aus dem B
uch "Python von K
opf bis Fu&
szlig;", ISB
N 978-3-89721-318-0
http://ww
w.oreilly.de/catalog/hfpythonger/
Dieser A
uszug unterliegt dem U
rheberrecht. © O
’Reilly V
erlag 2011
Sie sind hier 4 131
Persistenz
Von Kopf bis Fuß: Hallo, HC, wie geht es Ihnen?
Handgefertigter Code: Mir? Klasse! Und wenn es mal nicht so läuft, passe ich mich eben mal schnell an. Für mich ist das kein Problem. Warum setzt du dich nicht?
Von Kopf bis Fuß: Sicher, vielen Dank.
Handgefertigter Code: Hier, nimm den. Das ist mein neuer handgefertiger Bequem&Gesund™, Modell 2011, mit zusätzlichen Polstern und Beckenunterstützung … der passt sich automatisch an deine Körperformen an. Und, wie ist es?
Von Kopf bis Fuß: [Entspannt] Das füllt sich tatsäch-lich umwerfend an.
Handgefertigter Code: Verstehst du? Probleme gibt es für mich nicht. Ich bin ein wahrer »Hans-Dampf-in-allen-Gassen.« Du musst nur eine Anfrage stellen: Wenn es Handarbeit ist, ist alles möglich.
Von Kopf bis Fuß: Das erinnert mich an den Grund, weshalb ich hier bin. Ich habe eine etwas »heikle« Frage.
Handgefertigter Code: Nur raus damit, ich werde schon eine Lösung finden.
Von Kopf bis Fuß: Wann ist handgefertiger Code angemessen?
Handgefertigter Code: Ist das nicht klar? Er ist immer angemessen.
Von Kopf bis Fuß: Auch dann, wenn er langfristig zu Problemen führen kann?
Handgefertigter Code: Probleme?!? Habe ich es dir nicht eben gesagt? Für mich gibt es keine Probleme. An-passung ist mein Leben. Wenn etwas nicht mehr funktio-niert, repariere ich es.
Von Kopf bis Fuß: Selbst wenn eine vorgefertigte Lö-sung vielleicht besser passen würde?
Handgefertigter Code: Vorgefertigt? Du meinst – und ich wage es kaum auszusprechen – Massenproduktion?
Von Kopf bis Fuß: Ja. Insbesondere, wenn die Pro-gramme komplexer werden?
Handgefertigter Code: Wie bitte?!? Gerade da glänze ich doch: bei der Erstellung elegant gestalteter, handgefer-tiger Lösungen für Software-Probleme.
Von Kopf bis Fuß: Aber warum soll man das Rad neu erfinden, wenn so etwas schon einmal gemacht wurde?
Handgefertigter Code: Aber alles, was ich mache, ist handgefertigt; deswegen wendet man sich an mich …
Von Kopf bis Fuß: Aber wenn Sie die Arbeit ande-rer nutzen würden, können Sie Ihre eigenen Aufgaben doppelt so schnell mit weniger Code erledigen. Das können Sie sicher nicht übertreffen?
Handgefertigter Code: »Nutzen« … das ist ja nur noch ein Schritt zu ausnutzen?
Von Kopf bis Fuß: Eher Zusammenarbeit, Teilen, Teilnahme und gemeinschaftliche Arbeit.
Handgefertigter Code: [Schockiert] Du meinst, ich soll meinen Code … weggeben?
Von Kopf bis Fuß: Na … mehr nach dem Motto: Wie du mir so ich dir. Ich kratz dir den Rücken, wenn du mir den Rücken kratzt. Wie klingt das?
Handgefertigter Code: Ekelhaft.
Von Kopf bis Fuß: Sehr lustig [lacht]. Ich will doch nur sagen, dass es nicht immer ratsam ist, alles von Grund auf mit handgefertigtem Code aufzubauen, wenn es bereits eine hinreichend gute Lösung für ein Problem gibt.
Handgefertigter Code: Na ja … die sitzt aber nie so perfekt wie dieser Stuhl.
Von Kopf bis Fuß: Aber man kann trotzdem darauf sitzen!
Handgefertigter Code: [Lacht] Du solltest mal mit meinem Kumpel Pickle reden … der redet ständig von dem Kram und dann lebt er auch noch in einer Bibliothek.
Von Kopf bis Fuß: Ich denke, ich werde mich mal mit ihm in Verbindung setzen. Danke!
Handgefertigter Code: Hier, meine Karte – nur für den Fall der Fälle, dass du vielleicht doch etwas Handge-fertigtes brauchst.
Handgefertigter Code im GesprächInterview der Woche:Wann ist handgefertigter Code angemessen?
Paul Barry, Python von Kopf bis Fuß, O´Reilly, ISBN 9783897213180
Dies ist ein A
uszug aus dem B
uch "Python von K
opf bis Fu&
szlig;", ISB
N 978-3-89721-318-0
http://ww
w.oreilly.de/catalog/hfpythonger/
Dieser A
uszug unterliegt dem U
rheberrecht. © O
’Reilly V
erlag 2011
132 Kapitel 4
Der Pickler
Daten konserv ierenPythons Standardbibliothek enthält ein Modul namens pickle, das beinahe jedes Python-Datenobjekt speichern und laden kann, Listen eingeschlossen.
Haben Sie Ihre Daten in eine Datei konserviert oder gepickelt, dann sind sie persistent und können zu einem späteren Zeitpunkt in jedes andere Programm geladen werden:
['Is this the right room for an argument?', "No you haven't!", 'When?', "No you didn't!", "You didn't!", 'You did not!', 'Ah! (taking out his wallet and paying) Just the five minutes.', 'You most certainly did not!', "Oh no you didn't!", "Oh no you didn't!", "Oh look, this isn't an argument!", "No it isn't!", "It's just contradiction!", 'It IS!', 'You just contradicted me!', 'You DID!', 'You did just then!', '(exasperated) Oh, this is futile!!', 'Yes it is!']
[‘Is this the right room for an argument?’, »No you haven’t!«, ‘When?’, »No you didn’t!«, »You didn’t!«, ‘You did not!’, ‘Ah! (taking out his wallet and paying) Just the five minutes.’, ‘You most certainly did not!’, »Oh no you didn’t!«, »Oh no you didn’t!«, »Oh look, this isn’t an argument!«, »No it isn’t!«, »It’s just contradiction!«, ‘It IS!’, ‘You just contradicted me!’, ‘You DID!’, ‘You did just then!’, ‘(exasperated) Oh, this is futile!!’, ‘Yes it is!’]
Ihre Daten, wie sie in Pythons Listen erscheinen
Die Pickle-Maschine
Ihre gepickelten Daten
Die Python-Daten werden an Pickle übergeben.
Heraus kommt eine gepickelte Version der Daten.
Sie können beispielsweise Ihre gepickelten Daten auf der Festplatte speichern, in eine Datenbank stecken oder über ein Netzwerk an einen anderen Computer senden.
Wenn Sie bereit sind, werden die gepickelten Daten im umgekehrten Prozess entpickelt und in ihrer ursprünglichen Form in Pythons Speicher wiederhergestellt:
['Is this the right room for an argument?', "No you haven't!", 'When?', "No you didn't!", "You didn't!", 'You did not!', 'Ah! (taking out his wallet and paying) Just the five minutes.', 'You most certainly did not!', "Oh no you didn't!", "Oh no you didn't!", "Oh look, this isn't an argument!", "No it isn't!", "It's just contradiction!", 'It IS!', 'You just contradicted me!', 'You DID!', 'You did just then!', '(exasperated) Oh, this is futile!!', 'Yes it is!']
[‘Is this the right room for an argument?’, »No you haven’t!«, ‘When?’, »No you didn’t!«, »You didn’t!«, ‘You did not!’, ‘Ah! (taking out his wallet and paying) Just the five minutes.’, ‘You most certainly did not!’, »Oh no you didn’t!«, »Oh no you didn’t!«, »Oh look, this isn’t an argument!«, »No it isn’t!«, »It’s just contradiction!«, ‘It IS!’, ‘You just contradicted me!’, ‘You DID!’, ‘You did just then!’, ‘(exasperated) Oh, this is futile!!’, ‘Yes it is!’]
Ihre Daten werden in Pythons Speicher genau wie zuvor wiederhergestellt.Die gleiche Pickle-Maschine
Ihre gepickelten Daten
Verfüttern Sie die gepickelten Daten an Pickle.
Heraus kommt eine Python-Version der gepickelten Daten.
Dies ist ein A
uszug aus dem B
uch "Python von K
opf bis Fu&
szlig;", ISB
N 978-3-89721-318-0
http://ww
w.oreilly.de/catalog/hfpythonger/
Dieser A
uszug unterliegt dem U
rheberrecht. © O
’Reilly V
erlag 2011
Sie sind hier 4 133
Persistenz
Mit dump spe ichern und mit load wiederherste l lenDer Einsatz von pickle ist einfach: Importieren Sie das erforderliche Modul und nutzen Sie dann dump(), um Ihre Daten zu speichern, und dann etwas später load(), um sie wiederherzustellen. Die einzige Anforderung bei der Arbeit mit gepickelten Dateien ist die, dass sie im Binärmodus geöffnet werden müssen.
import pickle
...
with open('daten.pickle', 'wb') as daten_speichern:
pickle.dump([1, 2, 'drei'], daten_speichern)
...
with open('daten.pickle', 'rb') as daten_laden:
liste = pickle.load(daten_laden)
print(liste)
Und wenn et was schiefgeht?Wenn beim Pickeln oder Entpickeln Ihrer Daten etwas schiefgeht, löst das pickle-Modul eine Ausnahme des Typs PickleError aus.
Das »b« sagt Python, dass die Datendateien im BINÄRMODUS geöffnet werden sollen.
Denken Sie daran, »pickle« zu importieren.
Sie speichern die Daten mit »dump()«.
Sie stellen die Daten aus der Datei mit »load()« wieder her.
Die geladenen Daten werden einem Bezeichner
zugewiesen.
Sind die Daten wieder in Ihrem Programm, dann können
Sie sie behandeln wie jedes andere Datenobjekt.
w Hier ist ein Ausschnitt aus unserem Code, wie er aktuell aussieht. Nehmen Sie sich einen Stift und streichen Sie den Code durch, den Sie nicht mehr benötigen, und ersetzen Sie ihn dann durch Code, der die Pickle-Funktionalität nutzt. Fügen Sie gegebenenfalls zusätzlichen Code an, falls Sie denken, dass dies nötig ist.
try:
with open('mann_daten.txt', 'w') as mann_datei, open('anderer_daten.txt', 'w') as anderer_datei:
schachtler.print_lvl(mann, dh=mann_datei)
schachtler.print_lvl(anderer, dh=anderer_datei)
except IOError as err:
print('Dateifehler: ' + str(err))
Spitzen Sie Ihren Bleistift
Paul Barry, Python von Kopf bis Fuß, O´Reilly, ISBN 9783897213180
Dies ist ein A
uszug aus dem B
uch "Python von K
opf bis Fu&
szlig;", ISB
N 978-3-89721-318-0
http://ww
w.oreilly.de/catalog/hfpythonger/
Dieser A
uszug unterliegt dem U
rheberrecht. © O
’Reilly V
erlag 2011
134 Kapitel 4
Konserven und Bedeutung
Hier ist ein Ausschnitt aus unserem Code, wie er aktuell aussieht. Sie sollten den Code streichen, den Sie nicht mehr benötigen, und durch Code ersetzen, der die Pickle-Funktionalität nutzt. Gegebenenfalls sollten Sie zusätzlichen Code anfügen, falls Sie denken, dass das nötig ist.
try:
with open('mann_daten.txt', 'w') as mann_datei, open('anderer_daten.txt', 'w') as anderer_datei:
schachtler.print_lvl(mann, dh=mann_datei)
schachtler.print_lvl(anderer, dh=anderer_datei)
except IOError as err:
print('Dateifehler: ' + str(err))
import pickle
except pickle.PickleError as perr:
pickle.dump(mann, mann_datei)pickle.dump(anderer, anderer_datei)
print('Pickle-Fehler: ' + str(perr))
‘wb' 'wb'
Importieren Sie oben im Programm »pickle«.
Ersetzen Sie die beiden Aufrufe von »schachtler.print_lvl()« durch Aufrufe von »pickle.dump()«.
Vergessen Sie nicht, eventuell auftretende Ausnahmen abzufangen.
Ändern Sie den Zugriffsmodus in »schreibbar, binär«.
F: Als Sie weiter vorne print_lvl() aufgerufen haben, haben Sie nur zwei Argumente angegeben, obwohl die Funktionssignatur doch eigentlich vier Argumente verlangt. Wie ist das möglich?
A: Wenn Sie in Ihrem Code eine Python-Funktion aufrufen, haben Sie mehrere Möglichkeiten, insbesondere wenn die Funktion Standard-werte für einige Argumente anbietet. Wenn Sie positionelle Argumente nutzen, bestimmt die Reihenfolge der Argumente im Funktionsaufruf, welche Daten welchem Argument zugewiesen werden. Wenn die Funktion Argumente hat, für die es Standardwerte gibt, müssen Sie sich nicht immer Gedanken darüber machen, dass positionelle Argumente zugewiesen werden.
F: Das verstehe ich nicht. Können Sie das erläutern?
A: Nehmen Sie beispielsweise print(). Die Signatur sieht so aus: print(value, sep=' ', end='\n', file=sys.stdout). Standardmäßig gibt diese BIF auf die Standardausgabe (den Bildschirm) aus, weil das Argument file den Standardwert sys.stdout hat. Dieses Argument ist das vierte positionelle Argument. Wenn Sie aber die Daten an eine andere Einheit als den Bildschirm senden wollen, müssen Sie keine Werte für das zweite und dritte positionelle Argument angeben (und wollen es wahrscheinlich auch nicht). Für beide Argumente sind Standardwerte definiert, Sie müssen also nur Werte für sie angeben, wenn die Standardwerte nicht Ihren Anforderungen entsprechen. Wenn Sie nur Daten in eine Datei schreiben wollen, rufen Sie print() so auf: print("Dead Parrot Sketch", file='monty_sketch.txt'). Das vierte positionelle Argument nutzt dann den Wert, den Sie angege-ben haben, die anderen Argumente nutzen ihre Standardwerte. In Python funktionieren nicht nur BIFs auf diese Weise. Der Mechanismus wird auch von Ihren eigenen Funktionen unterstützt.
LösungSpitzen Sie Ihren Bleistift
Es gibt keineDummen Fragen
Dies ist ein A
uszug aus dem B
uch "Python von K
opf bis Fu&
szlig;", ISB
N 978-3-89721-318-0
http://ww
w.oreilly.de/catalog/hfpythonger/
Dieser A
uszug unterliegt dem U
rheberrecht. © O
’Reilly V
erlag 2011
Sie sind hier 4 135
Persistenz
PROBEFAHRTSchauen wir uns an, was passiert, nachdem der Code so geändert wurde, dass er das standardmäßig pickle-Modul anstelle Ihres eigenen schachtler-Moduls nutzt. Laden Sie den verbesserten Code in IDLE und drücken Sie F5.
Prüfen wir erneut den Inhalt der Dateien, um zu schauen, wie dieser aussieht:
Wieder erhalten Sie keinen visuellen Hinweis darauf, dass überhaupt etwas passiert ist.
Das sind die gepickelten Daten des anderen Mannes.
Das sind die gepickelten Mann-Daten.
Es scheint funktioniert zu haben … aber diese Dateien sehen chaotisch aus! Warum das?
Erinnern Sie sich daran, dass Python die Daten pickelt, nicht Sie. Damit es das effizient erledigen kann, nutzt Pythons pickle-Modul ein eigenes Binärformat (das als Protokoll bezeichnet wird). Wie Sie sehen können, sieht dieses Format ausgesprochen seltsam aus, wenn Sie es in einem Editor betrachten.
Machen Sie sich keine Gedanken. Es soll so aussehen.
Paul Barry, Python von Kopf bis Fuß, O´Reilly, ISBN 9783897213180
Dies ist ein A
uszug aus dem B
uch "Python von K
opf bis Fu&
szlig;", ISB
N 978-3-89721-318-0
http://ww
w.oreilly.de/catalog/hfpythonger/
Dieser A
uszug unterliegt dem U
rheberrecht. © O
’Reilly V
erlag 2011
136 Kapitel 4
IDLE-Sitzung
pickle glänzt, wenn Sie zuvor gepickelte Daten in ein anderes Programm laden. Natürlich hält uns auch nichts davon ab, pickle mit schachtler zu nutzen. Schließlich soll jedes Modul für unterschiedliche Zwecke verwendet werden können. Schauen wir uns das anhand von ein paar Codezeilen in der IDLEs-Shell an. Importieren Sie zunächst alle erforderlichen Module:
>>> import pickle
>>> import schachtler
Keine Überraschungen, nicht wahr? Nächster Schritt: Definieren Sie einen Bezeichner, der die zu entpickelnden Daten aufnimmt. Erstellen Sie eine Liste namens neuer_mann:
>>> neuer_mann = []
Unglaublich aufregend, nicht wahr? Laden Sie jetzt die gepickelten Daten in die erstellte Liste. Wenn Sie mit externen Datendateien arbeiten, ist es ratsam, Code in try/except einzuschließen:
>>> try:
with open('mann_daten.txt', 'rb') as mann_datei:
neuer_mann = pickle.load(mann_datei)
except IOError as err:
print('Dateifehler: ' + str(err))
except pickle.PickleError as perr:
print('Pickle-Fehler: ' + str(perr))
Auch das ist nichts Neues. Aber jetzt wurden Ihre Daten entpickelt und der Liste neuer_mann zugewiesen. Nun darf schachtler die Bühne betreten:
>>> schachtler.print_lvl(neuer_mann)
Is this the right room for an argument?
No you haven’t!
When?
No you didn’t!
...
You did just then!
(exasperated) Oh, this is futile!!
Yes it is!
Zeigen wir zum Abschluss nur die erste und die letzte der Zeilen an:
>>> print(neuer_mann[0])
Is this the right room for an argument?
>>> print(neuer_mann[-1])
Yes it is!
Hier werden nicht alle Daten gezeigt. Aber glauben Sie uns, es sind alle da.
Sie sehen: Alles da!
Eine IDLE-Sitzung
Dies ist ein A
uszug aus dem B
uch "Python von K
opf bis Fu&
szlig;", ISB
N 978-3-89721-318-0
http://ww
w.oreilly.de/catalog/hfpythonger/
Dieser A
uszug unterliegt dem U
rheberrecht. © O
’Reilly V
erlag 2011
Sie sind hier 4 137
Persistenz
Allgemeine Date i-Ein-/Ausgabe ist das gee ignetere Verfahren!
Ganz gleich, welche Daten Sie in Ihren Python-Programmen erstellen und ver-
arbeiten, Sie haben jetzt ein einfaches, erprobtes und taugliches Mittel zum
Speichern und Wiederherstellen Ihrer Daten. Ist das nicht genial?
Python kümmert sich um die Einzelheiten der Ein-/Ausgabe, damit Sie sich darauf konzentrieren können, was Ihr Code eigentlich tun soll.
Wie Sie gesehen haben, ist die Verarbeitung, das Speichern und Wiederherstellen von Daten in Listen dank Python ein Kinderspiel. Aber welche anderen Datenstrukturen unterstützt Python von Haus aus?
Das finden wir nun in Kapitel 5 heraus.
Paul Barry, Python von Kopf bis Fuß, O´Reilly, ISBN 9783897213180
Dies ist ein A
uszug aus dem B
uch "Python von K
opf bis Fu&
szlig;", ISB
N 978-3-89721-318-0
http://ww
w.oreilly.de/catalog/hfpythonger/
Dieser A
uszug unterliegt dem U
rheberrecht. © O
’Reilly V
erlag 2011
138 Kapitel 4
Python-Werkzeugkasten
Ihr Python-Werkzeugkasten
Jetzt haben Sie sich Kapitel 4 einverleibt und Ihrem Werk-zeugkasten einige weitere elementare Python-Techniken hinzugefügt.
CHAPTER 4
Die Methode strip() entfernt unerwünschten Leerraum aus Strings.
Das file-Argument für die print()-BIF steuert, wohin die Daten gesendet/geschrieben werden.
Die finally-Suite wird immer ausgeführt, egal ob in einem try/except Ausnahmen auftreten oder nicht.
Einer except-Suite wird ein Exception-Objekt übergeben, das über das Schlüsselwort as einem Bezeichner zugeweisen werden kann.
Die str()-BIF kann genutzt werden, um die Stringdarstellung von Datenobjekten zu erhalten, die diese Umwandlung unterstützen.
Die locals()-BIF liefert eine Sammlung der Variablen innerhalb des aktuellen Geltungsbe-reichs.
Der in-Operator prüft auf Vorhandensein.
Der »+«-Operator verkettet zwei Strings, wenn er mit Strings genutzt wird. Wird er mit Zahlen genutzt, dann werden diese addiert.
Die with-Anweisung sorgt dafür, dass geöffnete Dateien automatisch geschlossen werden, selbst wenn Ausnahmen auftreten. Die with-Anwei-sung nutzt ebenfalls das as-Schlüsselwort.
sys.stdout ist in Python die »Standardaus-gabe«. Hierauf kann über das sys-Modul der Standardbibliothek zugegriffen werden.
Das pickle-Modul der Standardbibliothek bietet Ihnen ein einfaches und effizientes Verfah-ren zur Speicherung und Wiederherstellung von Python-Datenobjekten auf der Festplatte.
Die Funktion pickle.dump() speichert Daten auf der Festplatte.
Die Funktion pickle.load() stellt Daten von der Festplatte wieder her.
Python-Jargon• »Unveränderliche
Typen« -
Python-Datentypen, deren Wert,
sobald er einmal zugewiesen ist,
nicht mehr geändert werden kann.
• »Pickeln« heißt der Prozess des
Speicherns von Datenobjekten z
ur
persistenten Speicherung.
• »Entpickeln« heißt der
Prozess des Wiederherstellens eines
gespeicherten Datenobjekts au
s
persistenter Speicherung.
Kap
itel 4
Punkt für Punkt