Paul Barry, Python von Kopf bis Fuß, O´Reilly, ISBN ... · Wollen Sie effektiv mit Ihren Daten...

48
Paul Barry, Python von Kopf bis Fuß, O´Reilly, ISBN 9783897213180 D3kjd3Di38lk323nnm

Transcript of Paul Barry, Python von Kopf bis Fuß, O´Reilly, ISBN ... · Wollen Sie effektiv mit Ihren Daten...

Page 1: Paul Barry, Python von Kopf bis Fuß, O´Reilly, ISBN ... · Wollen Sie effektiv mit Ihren Daten arbeiten, müssen Sie sie häufig manipulieren und in ein allgemeines Format überführen,

Paul Barry, Python von Kopf bis Fuß, O´Reilly, ISBN 9783897213180

D3kjd3Di38lk323nnm

Page 2: Paul Barry, Python von Kopf bis Fuß, O´Reilly, ISBN ... · Wollen Sie effektiv mit Ihren Daten arbeiten, müssen Sie sie häufig manipulieren und in ein allgemeines Format überführen,

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

Page 3: Paul Barry, Python von Kopf bis Fuß, O´Reilly, ISBN ... · Wollen Sie effektiv mit Ihren Daten arbeiten, müssen Sie sie häufig manipulieren und in ein allgemeines Format überführen,

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

Page 4: Paul Barry, Python von Kopf bis Fuß, O´Reilly, ISBN ... · Wollen Sie effektiv mit Ihren Daten arbeiten, müssen Sie sie häufig manipulieren und in ein allgemeines Format überführen,

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

Page 5: Paul Barry, Python von Kopf bis Fuß, O´Reilly, ISBN ... · Wollen Sie effektiv mit Ihren Daten arbeiten, müssen Sie sie häufig manipulieren und in ein allgemeines Format überführen,

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

Page 6: Paul Barry, Python von Kopf bis Fuß, O´Reilly, ISBN ... · Wollen Sie effektiv mit Ihren Daten arbeiten, müssen Sie sie häufig manipulieren und in ein allgemeines Format überführen,

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!’]

Page 7: Paul Barry, Python von Kopf bis Fuß, O´Reilly, ISBN ... · Wollen Sie effektiv mit Ihren Daten arbeiten, müssen Sie sie häufig manipulieren und in ein allgemeines Format überführen,

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

Page 8: Paul Barry, Python von Kopf bis Fuß, O´Reilly, ISBN ... · Wollen Sie effektiv mit Ihren Daten arbeiten, müssen Sie sie häufig manipulieren und in ein allgemeines Format überführen,

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

Page 9: Paul Barry, Python von Kopf bis Fuß, O´Reilly, ISBN ... · Wollen Sie effektiv mit Ihren Daten arbeiten, müssen Sie sie häufig manipulieren und in ein allgemeines Format überführen,

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

Page 10: Paul Barry, Python von Kopf bis Fuß, O´Reilly, ISBN ... · Wollen Sie effektiv mit Ihren Daten arbeiten, müssen Sie sie häufig manipulieren und in ein allgemeines Format überführen,

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

Page 11: Paul Barry, Python von Kopf bis Fuß, O´Reilly, ISBN ... · Wollen Sie effektiv mit Ihren Daten arbeiten, müssen Sie sie häufig manipulieren und in ein allgemeines Format überführen,

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

Page 12: Paul Barry, Python von Kopf bis Fuß, O´Reilly, ISBN ... · Wollen Sie effektiv mit Ihren Daten arbeiten, müssen Sie sie häufig manipulieren und in ein allgemeines Format überführen,

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

Page 13: Paul Barry, Python von Kopf bis Fuß, O´Reilly, ISBN ... · Wollen Sie effektiv mit Ihren Daten arbeiten, müssen Sie sie häufig manipulieren und in ein allgemeines Format überführen,

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

Page 14: Paul Barry, Python von Kopf bis Fuß, O´Reilly, ISBN ... · Wollen Sie effektiv mit Ihren Daten arbeiten, müssen Sie sie häufig manipulieren und in ein allgemeines Format überführen,

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

Page 15: Paul Barry, Python von Kopf bis Fuß, O´Reilly, ISBN ... · Wollen Sie effektiv mit Ihren Daten arbeiten, müssen Sie sie häufig manipulieren und in ein allgemeines Format überführen,

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

Page 16: Paul Barry, Python von Kopf bis Fuß, O´Reilly, ISBN ... · Wollen Sie effektiv mit Ihren Daten arbeiten, müssen Sie sie häufig manipulieren und in ein allgemeines Format überführen,

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.

Page 17: Paul Barry, Python von Kopf bis Fuß, O´Reilly, ISBN ... · Wollen Sie effektiv mit Ihren Daten arbeiten, müssen Sie sie häufig manipulieren und in ein allgemeines Format überführen,

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

Page 18: Paul Barry, Python von Kopf bis Fuß, O´Reilly, ISBN ... · Wollen Sie effektiv mit Ihren Daten arbeiten, müssen Sie sie häufig manipulieren und in ein allgemeines Format überführen,

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)

Page 19: Paul Barry, Python von Kopf bis Fuß, O´Reilly, ISBN ... · Wollen Sie effektiv mit Ihren Daten arbeiten, müssen Sie sie häufig manipulieren und in ein allgemeines Format überführen,

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

Page 20: Paul Barry, Python von Kopf bis Fuß, O´Reilly, ISBN ... · Wollen Sie effektiv mit Ihren Daten arbeiten, müssen Sie sie häufig manipulieren und in ein allgemeines Format überführen,

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

Page 21: Paul Barry, Python von Kopf bis Fuß, O´Reilly, ISBN ... · Wollen Sie effektiv mit Ihren Daten arbeiten, müssen Sie sie häufig manipulieren und in ein allgemeines Format überführen,

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

Page 22: Paul Barry, Python von Kopf bis Fuß, O´Reilly, ISBN ... · Wollen Sie effektiv mit Ihren Daten arbeiten, müssen Sie sie häufig manipulieren und in ein allgemeines Format überführen,

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

Page 23: Paul Barry, Python von Kopf bis Fuß, O´Reilly, ISBN ... · Wollen Sie effektiv mit Ihren Daten arbeiten, müssen Sie sie häufig manipulieren und in ein allgemeines Format überführen,

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

Page 24: Paul Barry, Python von Kopf bis Fuß, O´Reilly, ISBN ... · Wollen Sie effektiv mit Ihren Daten arbeiten, müssen Sie sie häufig manipulieren und in ein allgemeines Format überführen,

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.

Page 25: Paul Barry, Python von Kopf bis Fuß, O´Reilly, ISBN ... · Wollen Sie effektiv mit Ihren Daten arbeiten, müssen Sie sie häufig manipulieren und in ein allgemeines Format überführen,

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

Page 26: Paul Barry, Python von Kopf bis Fuß, O´Reilly, ISBN ... · Wollen Sie effektiv mit Ihren Daten arbeiten, müssen Sie sie häufig manipulieren und in ein allgemeines Format überführen,

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

Page 27: Paul Barry, Python von Kopf bis Fuß, O´Reilly, ISBN ... · Wollen Sie effektiv mit Ihren Daten arbeiten, müssen Sie sie häufig manipulieren und in ein allgemeines Format überführen,

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

Page 28: Paul Barry, Python von Kopf bis Fuß, O´Reilly, ISBN ... · Wollen Sie effektiv mit Ihren Daten arbeiten, müssen Sie sie häufig manipulieren und in ein allgemeines Format überführen,

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

Page 29: Paul Barry, Python von Kopf bis Fuß, O´Reilly, ISBN ... · Wollen Sie effektiv mit Ihren Daten arbeiten, müssen Sie sie häufig manipulieren und in ein allgemeines Format überführen,

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

Page 30: Paul Barry, Python von Kopf bis Fuß, O´Reilly, ISBN ... · Wollen Sie effektiv mit Ihren Daten arbeiten, müssen Sie sie häufig manipulieren und in ein allgemeines Format überführen,

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

Page 31: Paul Barry, Python von Kopf bis Fuß, O´Reilly, ISBN ... · Wollen Sie effektiv mit Ihren Daten arbeiten, müssen Sie sie häufig manipulieren und in ein allgemeines Format überführen,

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

Page 32: Paul Barry, Python von Kopf bis Fuß, O´Reilly, ISBN ... · Wollen Sie effektiv mit Ihren Daten arbeiten, müssen Sie sie häufig manipulieren und in ein allgemeines Format überführen,

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

Page 33: Paul Barry, Python von Kopf bis Fuß, O´Reilly, ISBN ... · Wollen Sie effektiv mit Ihren Daten arbeiten, müssen Sie sie häufig manipulieren und in ein allgemeines Format überführen,

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

Page 34: Paul Barry, Python von Kopf bis Fuß, O´Reilly, ISBN ... · Wollen Sie effektiv mit Ihren Daten arbeiten, müssen Sie sie häufig manipulieren und in ein allgemeines Format überführen,

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

Page 35: Paul Barry, Python von Kopf bis Fuß, O´Reilly, ISBN ... · Wollen Sie effektiv mit Ihren Daten arbeiten, müssen Sie sie häufig manipulieren und in ein allgemeines Format überführen,

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

Page 36: Paul Barry, Python von Kopf bis Fuß, O´Reilly, ISBN ... · Wollen Sie effektiv mit Ihren Daten arbeiten, müssen Sie sie häufig manipulieren und in ein allgemeines Format überführen,

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!

Page 37: Paul Barry, Python von Kopf bis Fuß, O´Reilly, ISBN ... · Wollen Sie effektiv mit Ihren Daten arbeiten, müssen Sie sie häufig manipulieren und in ein allgemeines Format überführen,

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

Page 38: Paul Barry, Python von Kopf bis Fuß, O´Reilly, ISBN ... · Wollen Sie effektiv mit Ihren Daten arbeiten, müssen Sie sie häufig manipulieren und in ein allgemeines Format überführen,

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

Page 39: Paul Barry, Python von Kopf bis Fuß, O´Reilly, ISBN ... · Wollen Sie effektiv mit Ihren Daten arbeiten, müssen Sie sie häufig manipulieren und in ein allgemeines Format überführen,

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

Page 40: Paul Barry, Python von Kopf bis Fuß, O´Reilly, ISBN ... · Wollen Sie effektiv mit Ihren Daten arbeiten, müssen Sie sie häufig manipulieren und in ein allgemeines Format überführen,

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?

Page 41: Paul Barry, Python von Kopf bis Fuß, O´Reilly, ISBN ... · Wollen Sie effektiv mit Ihren Daten arbeiten, müssen Sie sie häufig manipulieren und in ein allgemeines Format überführen,

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

Page 42: Paul Barry, Python von Kopf bis Fuß, O´Reilly, ISBN ... · Wollen Sie effektiv mit Ihren Daten arbeiten, müssen Sie sie häufig manipulieren und in ein allgemeines Format überführen,

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.

Page 43: Paul Barry, Python von Kopf bis Fuß, O´Reilly, ISBN ... · Wollen Sie effektiv mit Ihren Daten arbeiten, müssen Sie sie häufig manipulieren und in ein allgemeines Format überführen,

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

Page 44: Paul Barry, Python von Kopf bis Fuß, O´Reilly, ISBN ... · Wollen Sie effektiv mit Ihren Daten arbeiten, müssen Sie sie häufig manipulieren und in ein allgemeines Format überführen,

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

Page 45: Paul Barry, Python von Kopf bis Fuß, O´Reilly, ISBN ... · Wollen Sie effektiv mit Ihren Daten arbeiten, müssen Sie sie häufig manipulieren und in ein allgemeines Format überführen,

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

Page 46: Paul Barry, Python von Kopf bis Fuß, O´Reilly, ISBN ... · Wollen Sie effektiv mit Ihren Daten arbeiten, müssen Sie sie häufig manipulieren und in ein allgemeines Format überführen,

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

Page 47: Paul Barry, Python von Kopf bis Fuß, O´Reilly, ISBN ... · Wollen Sie effektiv mit Ihren Daten arbeiten, müssen Sie sie häufig manipulieren und in ein allgemeines Format überführen,

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

Page 48: Paul Barry, Python von Kopf bis Fuß, O´Reilly, ISBN ... · Wollen Sie effektiv mit Ihren Daten arbeiten, müssen Sie sie häufig manipulieren und in ein allgemeines Format überführen,

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