Eingabe und Ausgabe#

  • (brit flag input: _Eingabe)

  • (brit flag output: _Ausgabe)

Es wird Situationen geben, in denen Ihr Programm mit dem Benutzer interagieren muss. Zum Beispiel möchten Sie möglicherweise Eingaben vom Benutzer entgegennehmen und dann einige Ergebnisse zurückgeben. Dies können wir mit der input()-Funktion bzw. der print()-Funktion erreichen.

Für die Ausgabe können wir auch die verschiedenen Methoden der str (String)-Klasse verwenden. Sie können z. B. die Methode rjust verwenden, um eine Zeichenkette zu erhalten, die rechtsbündig mit einer bestimmten Breite ausgerichtet ist. Weitere Details finden Sie unter help(str).

Eine weitere häufige Art von Ein- und Ausgabe ist der Umgang mit Dateien. Die Fähigkeit, Dateien zu erstellen, zu lesen und zu schreiben, ist für viele Programme unerlässlich, und wir werden diesen Aspekt in diesem Kapitel untersuchen.

Benutzereingaben#

(brit flag user input)

Beispiel io_input_de.py

Quellcode
 1def rückwärts(text):
 2    return text[::-1]
 3
 4
 5def ist_es_ein_palindrome(text):
 6	# klein/Großschreibung ignorieren:
 7	# .lower() wandelt einen Textstring in 
 8	# Kleinbuchstaben um 
 9    return text.lower() == rückwärts(text).lower()
10
11# Beispiel für Palindrome: Renter, Kajak, Lagerregal
12antwort_text = input("Bitte einen Text eingeben: ")
13if ist_es_ein_palindrome(antwort_text):
14    print("Ja, das ist ein Palindrome")
15else:
16    print("Nein, das ist kein Palindrom")

Die Zeilennummern sind nicht Bestandteil des Quellcodes

Ausgabe
$ python3 io_input_de.py
Bitte einen Text eingeben: Rentner
Ja, das ist ein Palindrome


$ python3 io_input_de.pyBitte einen Text eingeben: Marmelade
Nein, das ist kein Palindrom

Wie es funktioniert

Wir verwenden die Slice-Funktion, um den Text umzukehren. Wir haben bereits gesehen, wie wir Slices aus Sequenzen mit dem Code seq[a:b] erstellen können, beginnend bei Position a bis Position b. Wir können auch ein drittes Argument angeben, das den Schritt (step) angibt, mit dem das Slicing durchgeführt wird. Der Standard-Schritt ist 1, wodurch ein durchgehender Teil des Textes zurückgegeben wird. Ein negativer Schritt, z. B. -1, gibt den Text in umgekehrter Reihenfolge zurück.

Die Funktion input() nimmt eine Zeichenkette als Argument entgegen und zeigt sie dem Benutzer an. Dann wartet sie darauf, dass der Benutzer etwas eingibt und die Eingabetaste drückt. Sobald der Benutzer die Eingabe getätigt und die Eingabetaste gedrückt hat, gibt die Funktion input() den eingegebenen Text zurück.

Wir nehmen diesen Text und kehren ihn um. Wenn der ursprüngliche Text und der umgekehrte Text gleich sind, dann ist der Text ein palindrome.

Hausaufgabe#

Das Überprüfen, ob ein Text ein Palindrom ist, sollte auch Interpunktion, Leerzeichen und Groß-/Kleinschreibung ignorieren. Zum Beispiel ist “Rise to vote, sir.” ebenfalls ein Palindrom, aber unser aktuelles Programm erkennt dies nicht. Können Sie das Programm so anpassen, dass es solche Fälle erkennt?

Einen Tipp zu dieser Hausübung finden Sie in der Fußnote1Verwenden Sie ein Tupel (eine Liste aller Satzzeichen finden Sie online), um alle zu ignorierenden Zeichen zu speichern. Verwenden Sie dann den Mitgliedschaftstest, um festzustellen, ob ein Zeichen entfernt werden soll, z. B. forbidden = ('!', '?', '.', ...).

Dateien#

(brit flag files)

Sie können Dateien zum Lesen oder Schreiben öffnen und verwenden, indem Sie ein Objekt der Klasse file erstellen und dessen Methoden read, readline oder write verwenden, um aus der Datei zu lesen (read) oder in sie zu schreiben (write). Die Fähigkeit, auf eine Datei zuzugreifen oder sie zu verändern, hängt vom Modus ab, in dem die Datei geöffnet wurde. Wenn Sie mit der Datei fertig sind, rufen Sie close auf, um Python mitzuteilen, dass die Datei nicht länger benötigt wird.

Beispiel io_using_file_de.py

Quellcode
 1gedicht = '''\
 2Programmieren macht Spaß
 3wenn die Arbeit getan ist.
 4Wenn Du Spaß an der Arbeit haben willst:
 5    verwende Python!
 6'''
 7
 8# Datei schreiben ("w" steht für "writing") 
 9f = open('gedicht.txt', 'w')
10# Text in die Datei schreiben
11f.write(gedicht)
12# Datei schließen
13f.close()
14
15# Wenn bei open kein Modus angegeben wird,
16# öffnet Python die Datei im Lesemodus 
17# (r steht für "read")
18f = open('gedicht.txt')
19while True:
20    zeile = f.readline()
21    # Eine Zeile mit Länge 0 bedeutet End of File (EOF)
22    if len(zeile) == 0:
23        break
24    # Jede Zeile in der Datei hat schon ein
25    # Zeilenende-Zeichen am Ende "eingebaut"
26    print(zeile, end='')
27# Datei schließen
28f.close()

Die Zeilennummern sind nicht Bestandteil des Quellcodes

Ausgabe
python3 io_using_file_de.py
Programmieren macht Spaß
wenn die Arbeit getan ist.
Wenn Du Spaß an der Arbeit haben willst:
    verwende Python!

Wie es funktioniert:

Beachten Sie, dass wir ein neues Dateiobjekt einfach durch die Verwendung der Funktion open erzeugen können. Wir öffnen (oder erzeugen, falls die Datei noch nicht existiert) diese Datei mit der eingebauten Funktion open, wobei wir den Namen der Datei und den Modus angeben, in dem wir die Datei öffnen möchten. Der Modus kann ein Lesemodus ('r'), ein Schreibmodus ('w') oder ein Anhängemodus ('a') sein. Wir können außerdem angeben, ob wir im Textmodus ('t') oder im Binärmodus ('b') lesen, schreiben oder anhängen. Es gibt in der Tat noch viele weitere Modi; help(open) gibt Ihnen die Details. Standardmäßig behandelt open() eine Datei als Textdatei ('t') und öffnet sie im Lesemodus ('r').

In unserem Beispiel öffnen wir die Datei zunächst im Schreib-Textmodus und verwenden dann die Methode write des Dateiobjekts, um unsere String-Variable gedicht in die Datei zu schreiben, und schließen anschließend die Datei mit close.

Danach öffnen wir dieselbe Datei erneut zum Lesen. Wir müssen keinen Modus angeben, da „Textdatei lesen“ der Standardmodus ist. Wir lesen jede Zeile der Datei mithilfe der Methode readline innerhalb einer Schleife ein. Diese Methode gibt eine vollständige Zeile zurück, inklusive des Zeilenumbruchs am Ende. Wenn eine leere Zeichenkette zurückgegeben wird, bedeutet dies, dass wir das Ende der Datei erreicht haben, und wir verlassen die Schleife mittels break.

Am Ende schließen wir die Datei mit close.

Wir können anhand der Ausgabe erkennen, dass dieses Programm tatsächlich in die Datei gedicht.txt geschrieben und anschließend wieder daraus gelesen hat.

Pickle#

(brit flag pickle: eindosen, konservieren)

Python bietet ein Standardmodul namens pickle, mit dem Sie beliebige einfache Python-Objekte in einer Datei speichern und später wieder abrufen können. Diese Art des Speicherns wird als persistente Speicherung bezeichnet.

Beispiel io_pickle_de.py

Quellcode
 1import pickle
 2
 3# Der Dateiname in dem das Python-Objekt gespeichert wird
 4dateiname = 'einkaufsliste.data'
 5# Ein einfaches Python-Objekt: eine Liste
 6einkaufsliste = ['Apfel', 'Mango', 'Karotte']
 7
 8# In die Datei schreiben (wb bedeutet "write binary")
 9f = open(dateiname, 'wb')
10# Das Ojbekt in die Datei reinschreiben (dump)
11pickle.dump(einkaufsliste, f)
12f.close()
13
14# Die Variable aus dem Speicher löschen
15del einkaufsliste
16
17# Aus der Datei lesen (rb bedeutet "read binary")
18f = open(dateiname, 'rb')
19# Objekt aus der Datei laden
20liste_aus_der_festplatte = pickle.load(f)
21print(liste_aus_der_festplatte)
22f.close()

Die Zeilennummern sind nicht Bestandteil des Quellcodes

Ausgabe

Wie es funktioniert:

Um ein Objekt in einer Datei zu speichern, müssen wir die Datei im Schreib-Binärmodus öffnen ('wb') und anschließend die Funktion dump des pickle-Moduls aufrufen. Dieser Prozess wird pickling genannt.

Wir rufen das Objekt dann mithilfe der Funktion load Funktion des pickle-Moduls wieder ab, die das Objekt zurückliefert. Dieser Vorgang wird unpickling genannt.

Unicode#

Bisher haben wir beim Schreiben von Strings oder beim Lesen/Schreiben von Dateien nur einfache englische Zeichen verwendet. Sowohl englische als auch nicht-englische Zeichen können in Unicode dargestellt werden, und Python3 speichert alle Stringvariablen standardmäßig in Unicode.

Wenn Daten über das Internet übertragen werden, müssen sie als Bytes gesendet werden – etwas, das der Computer problemlos versteht. Die Regeln für die Übersetzung von Unicode (dem Format, in dem Python Strings speichert) in Bytes werden Encoding genannt. Eine gängige Kodierung ist UTF-8. Wir können im UTF-8-Format lesen und schreiben, indem wir beim Aufruf von open ein Argument zur Kodierung angeben.

Beispiel io_unicode_de.py

Quellcode
1# encoding=utf-8
2import io
3
4f = io.open("abc.txt", "wt", encoding="utf-8")
5f.write(u"Hier steht eine nicht-englische Sprache...")
6f.close()
7
8text = io.open("abc.txt", encoding="utf-8").read()
9print(text)

Die Zeilennummern sind nicht Bestandteil des Quellcodes

Wie es funktioniert:

Wir verwenden io.open und geben beim ersten Aufruf das Argument encoding an, um die Nachricht zu kodieren, und beim zweiten Aufruf erneut, um die Nachricht zu dekodieren. Beachten Sie, dass wir das Encoding-Argument nur im Textmodus verwenden sollten.

Wann immer wir ein Programm schreiben, das Unicode-Literale (also Strings mit einem vorangestellten u) verwendet, müssen wir sicherstellen, dass Python weiß, dass unser Programm UTF-8 benutzt. Dazu müssen wir die Zeile

# encoding=utf

an den Anfang des Programms setzen.

Weitere Informationen finden Sie in folgenden Quellen:

The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character SetsPython Unicode HowtoPragmatic Unicode (Vortrag von Nat Batchelder)

Zusammenfassung#

Wir haben verschiedene Arten der Ein- und Ausgabe besprochen, den Umgang mit Dateien, das Pickle-Modul und Unicode.

Als Nächstes werden wir das Konzept der Ausnahmen (exceptions) untersuchen.