Python3 Eingabe und Ausgabe
In den vorherigen Kapiteln haben wir tatsächlich bereits die Eingabe- und Ausgabefunktionalität von Python gestreift. In diesem Kapitel werden wir speziell die Eingabe und Ausgabe von Python vorstellen.
Schönere Ausgabeformatierung
Python hat zwei Möglichkeiten, Werte auszugeben: Ausdrucksanweisungen und die print()-Funktion.
Ein dritter Weg ist die Verwendung der write()-Methode von Dateiobjekten; die Standardausgabedatei kann als sys.stdout referenziert werden.
Wenn Sie mehr Vielfalt in der Form der Ausgabe wünschen, können Sie die Funktion str.format() verwenden, um Ausgabewerte zu formatieren.
Wenn Sie Ausgabewerte in Zeichenketten umwandeln möchten, können Sie die Funktionen repr() oder str() verwenden.
- str():Die Funktion gibt eine benutzerlesbare Darstellung zurück.
- repr():Sie erzeugt eine für den Interpreter lesbare Darstellung.
Beispiel
>>> str(s)
'Hello, Example'
>>> repr(s)
"'Hello, Example'"
>>> str(1/7)
'0.14285714285714285'
>>> x = 10 * 3.25
>>> y = 200 * 200
>>> s = 'The value of x is: ' + repr(x) + ', the value of y is:' + repr(y) + '...'
>>> print(s)
Der Wert von x ist:32.5,Der Wert von y ist:40000...
>>> # repr() kann Sonderzeichen in Zeichenketten maskieren
... hello = 'hello, example\n'
>>> hellos = repr(hello)
>>> print(hellos)
'hello, example\n'
>>> # Das Argument von repr() kann ein beliebiges Python-Objekt sein
... repr((x, y, ('Google', 'Example')))
"(32.5, 40000, ('Google', 'Example'))"
Hier sind zwei Möglichkeiten, eine Tabelle mit Quadraten und Kuben auszugeben:
... print(repr(x).rjust(2), repr(x*x).rjust(3), end=' ')
... # Beachten Sie die Verwendung von 'end' in der vorherigen Zeile
... print(repr(x*x*x).rjust(4))
...
1 1 1
2 4 8
3 9 27
4 16 64
5 25 125
6 36 216
7 49 343
8 64 512
9 81 729
10 100 1000
>>> for x in range(1, 11):
... print('{0:2d} {1:3d} {2:4d}'.format(x, x*x, x*x*x))
...
1 1 1
2 4 8
3 9 27
4 16 64
5 25 125
6 36 216
7 49 343
8 64 512
9 81 729
10 100 1000
Hinweis:Im ersten Beispiel werden die Leerzeichen zwischen den Spalten von print() hinzugefügt.
Dieses Beispiel demonstriert die rjust()-Methode des String-Objekts, die eine Zeichenkette rechtsbündig ausrichtet und links mit Leerzeichen auffüllt.
Es gibt ähnliche Methoden wie ljust() und center(). Diese Methoden schreiben nichts; sie geben einfach neue Zeichenketten zurück.
Eine weitere Methode, zfill(), füllt eine Zahl links mit Nullen auf, wie unten gezeigt:
'00012'
>>> '-3.14'.zfill(7)
'-003.14'
>>> '3.14159265359'.zfill(5)
'3.14159265359'
Die grundlegende Verwendung von str.format() ist wie folgt:
Example Tutorial website:"www.example.com!"
Die geschweiften Klammern und die darin enthaltenen Zeichen (Formatfelder genannt) werden durch die Argumente in format() ersetzt.
Zahlen in den Klammern werden verwendet, um auf die Position des übergebenen Objekts in format() zu verweisen, wie unten gezeigt:
Google and Example
>>> print('{1} and {0}'.format('Google', 'Example'))
Example and Google
Wenn Schlüsselwortargumente in format() verwendet werden, verweisen ihre Werte auf die Argumente, die diesen Namen verwenden.
Beispiel-Tutorial Website: www.example.com
Positionsargumente und Schlüsselwortargumente können beliebig kombiniert werden:
Websiteliste Google, Beispiel,und Taobao.
!a(Mitascii()), !s(Mitstr()) und!r(Mit repr()) kann verwendet werden, um einen Wert vor der Formatierung umzuwandeln:
>>> print('Der Wert der Konstante PI ist ungefähr: {}.'.format(math.pi))
Der Wert der Konstante PI ist ungefähr:3.141592653589793。
>>> print('Der Wert der Konstante PI ist ungefähr: {!r}.'.format(math.pi))
Der Wert der Konstante PI ist ungefähr:3.141592653589793。
Ein optionaler:und Formatbezeichner kann auf den Feldnamen folgen. Dies ermöglicht eine bessere Formatierung des Wertes. Das folgende Beispiel rundet Pi auf drei Dezimalstellen:
>>> print('Der Wert der Konstante PI ist ungefähr {0:.3f}.'.format(math.Pi))
Der Wert der Konstante PI ist ungefähr3.142。
In:Wenn danach eine ganze Zahl übergeben wird, wird sichergestellt, dass das Feld mindestens so viele Zeichen breit ist. Dies ist nützlich, damit Tabellen gut aussehen.
>>> for name, number in table.items():
... print('{0:10} ==> {1:10d}'.format(name, number))
...
Google ==> 1
Beispiel ==> 2
Taobao ==> 3
Wenn Sie eine sehr lange Formatzeichenfolge haben und sie nicht aufteilen möchten, ist es eine gute Idee, nach Variablennamen statt nach Position zu formatieren.
Der einfachste Weg ist, ein Dictionary zu übergeben und dann eckige Klammern[]zu verwenden, um auf die Schlüssel zuzugreifen:
>>> print('Example: {0[Example]:d}; Google: {0[Google]:d}; Taobao: {0[Taobao]:d}'.format(table))
Example: 2; Google: 1; Taobao: 3
Sie können die gleiche Funktionalität auch erreichen, indem Sie**vor der Tabellenvariable verwenden:
>>> print('Beispiel: {Example:d}; Google: {Google:d}; Taobao: {Taobao:d}'.format(**table))
Example: 2; Google: 1; Taobao: 3
Alte Stringformatierung
%Der Operator kann auch eine Stringformatierung durchführen. Er interpretiert das linke Argument als einesprintf()-artige Formatzeichenkette, ersetzt das rechte Argument und gibt dann die formatierte Zeichenkette zurück. Zum Beispiel:
>>> print('Der Wert der Konstante PI ist ungefähr: %5.3f.' % math.pi)
Der Wert der Konstante PI ist ungefähr:3.142。
Weil str.format() eine relativ neue Funktion ist, verwendet der größte Teil des Python-Codes immer noch den %-Operator. Da diese Formatierung im alten Stil jedoch irgendwann aus der Sprache entfernt wird, sollte str.format() häufiger verwendet werden.
Tastatureingabe lesen
Python bietetdie integrierte Funktion input(), um eine Textzeile von der Standardeingabe zu lesen; die Standardeingabe ist standardmäßig die Tastatur.
Beispiel
str = input("Bitte eingeben: ");
print ("Der eingegebene Inhalt ist: ", str)
Dies erzeugt das folgende Ergebnis entsprechend der Eingabe:
Please enter: Example The content you entered is: Example
Dateien lesen und schreiben
In Python werden Dateioperationen mithilfe deropen()Funktion durchgeführt. Diese Funktion gibt ein Dateiobjekt für anschließende Lese- oder Schreibvorgänge zurück.
open()Die grundlegende Syntax lautet wie folgt:
open(filename, mode)
- filename:Der Pfad (String) der Datei, auf die zugegriffen werden soll.
- mode:Der Dateiöffnungsmodus wird verwendet, um anzugeben, wie gelesen oder geschrieben wird (z. B. schreibgeschützt, Schreiben, Anhängen usw.). Dieser Parameter ist optional, mit dem Standardwert
r(schreibgeschützt).
Übliche Dateiöffnungsmodi sind wie folgt (es wird empfohlen, sich auf das Beherrschen von r / w / a zu konzentrieren):
| Mode | Beschreibung |
|---|---|
| r | Öffnet die Datei im schreibgeschützten Modus (Standardmodus). Die Datei muss existieren, und der Dateizeiger befindet sich am Anfang. |
| rb | Öffnet die Datei im Binärformat für schreibgeschützten Zugriff (z. B. Bilder, Videos usw.). Der Dateizeiger befindet sich am Anfang. |
| r+ | Öffnet die Datei im Lese-/Schreibmodus. Die Datei muss existieren, und der Dateizeiger befindet sich am Anfang. |
| rb+ | Öffnet die Datei im Binärformat zum Lesen und Schreiben. Der Dateizeiger befindet sich am Anfang. |
| w | Öffnet die Datei im Nur-Schreibmodus. Wenn die Datei existiert, wird sieabgeschnitten; wenn sie nicht existiert, wird eine neue Datei erstellt. |
| wb | Öffnet die Datei im Binärformat für Nur-Schreiben. Wenn die Datei existiert, wird sie abgeschnitten; wenn sie nicht existiert, wird eine neue Datei erstellt. |
| w+ | Öffnet die Datei im Lese-/Schreibmodus. Wenn die Datei existiert, wird sie abgeschnitten; wenn sie nicht existiert, wird eine neue Datei erstellt. |
| wb+ | Öffnet die Datei im Binärformat zum Lesen und Schreiben. Wenn die Datei existiert, wird sie abgeschnitten; wenn sie nicht existiert, wird eine neue Datei erstellt. |
| a | Öffnet die Datei im Anhängemodus. Wenn die Datei existiert, wird geschriebener Inhalt an das Ende angehängt; wenn sie nicht existiert, wird eine neue Datei erstellt. |
| ab | Öffnet die Datei im Binärformat zum Anhängen. Geschriebener Inhalt wird an das Ende angehängt; wenn sie nicht existiert, wird eine neue Datei erstellt. |
| a+ | Öffnet die Datei im Lese-/Schreibmodus. Der Dateizeiger steht standardmäßig am Ende (Anhängemodus); falls sie nicht existiert, wird eine neue Datei erstellt. |
| ab+ | Öffnet die Datei im Binärformat zum Lesen und Schreiben. Der Dateizeiger steht standardmäßig am Ende; falls sie nicht existiert, wird eine neue Datei erstellt. |
Erklärung:Hinzufügenbnach dem Modus bedeutet, die Datei im Binärmodus zu bearbeiten, was häufig für die Verarbeitung von Nicht-Textdateien wie Bildern und Audio verwendet wird.
Das folgende Diagramm fasst diese Modi gut zusammen:
| Mode | r | r+ | w | w+ | a | a+ |
|---|---|---|---|---|---|---|
| read | + | + | + | + | ||
| write | + | + | + | + | + | |
| Erstelle | + | + | + | + | ||
| Überschreiben | + | + | ||||
| Zeiger am Anfang | + | + | + | + | ||
| Zeiger am Ende | + | + |
Das folgende Beispiel schreibt eine Zeichenkette in die Datei foo.txt:
Beispiel
# Eine Datei öffnen
f = open("/tmp/foo.txt", "w")
f.write( "Python ist eine sehr gute Sprache.\nJa, sie ist wirklich sehr gut!!"\n" )
# Die geöffnete Datei schließen
f.close()
- Das erste Argument ist der Name der zu öffnenden Datei.
- Der zweite Parameter beschreibt, wie die Datei verwendet wird. mode kann 'r' sein, wenn die Datei schreibgeschützt ist, 'w' nur zum Schreiben (eine vorhandene Datei mit demselben Namen wird gelöscht), und 'a' zum Anhängen an die Datei; alle geschriebenen Daten werden automatisch am Ende hinzugefügt. 'r+' ist sowohl zum Lesen als auch zum Schreiben. Der Parameter mode ist optional; 'r' ist der Standardwert.
An dieser Stelle öffnen Sie die Datei foo.txt; sie wird wie folgt angezeigt:
$ cat /tmp/foo.txt Python 是一个非常好的语言。 是的,的确非常好!!
Methoden von Dateiobjekten
Die übrigen Beispiele in diesem Abschnitt gehen davon aus, dass bereits ein Dateiobjekt namens f erstellt wurde.
f.read()
Um den Inhalt einer Datei zu lesen, rufen Sie f.read(size) auf, wodurch eine bestimmte Datenmenge gelesen und dann als String- oder Bytes-Objekt zurückgegeben wird.
size ist ein optionaler numerischer Parameter. Wenn size weggelassen wird oder negativ ist, wird der gesamte Inhalt der Datei gelesen und zurückgegeben.
Das folgende Beispiel setzt voraus, dass die Datei foo.txt bereits existiert (sie wurde im obigen Beispiel erstellt):
Beispiel
# Eine Datei öffnen
f = open("/tmp/foo.txt", "r")
str = f.read()
print(str)
# Die geöffnete Datei schließen
f.close()
Nach Ausführung des obigen Programms ist die Ausgabe:
Python 是一个非常好的语言。 是的,的确非常好!!
f.readline()
f.readline() liest eine einzelne Zeile aus der Datei. Das Zeilenumbruchzeichen ist '\n'. Wenn f.readline() einen leeren String zurückgibt, bedeutet das, dass die letzte Zeile bereits gelesen wurde.
Beispiel
# Eine Datei öffnen
f = open("/tmp/foo.txt", "r")
str = f.readline()
print(str)
# Die geöffnete Datei schließen
f.close()
Nach Ausführung des obigen Programms ist die Ausgabe:
Python 是一个非常好的语言。
f.readlines()
f.readlines() gibt alle Zeilen zurück, die in der Datei enthalten sind.
Wenn der optionale Parameter sizehint gesetzt ist, liest es die angegebene Byteanzahl und teilt diese Bytes nach Zeilen auf.
Beispiel
# Eine Datei öffnen
f = open("/tmp/foo.txt", "r")
str = f.readlines()
print(str)
# Die geöffnete Datei schließen
f.close()
Nach Ausführung des obigen Programms ist die Ausgabe:
['Python 是一个非常好的语言。\n', '是的,的确非常好!!\n']
Eine andere Möglichkeit besteht darin, über ein Dateiobjekt zu iterieren und dann jede Zeile zu lesen:
Beispiel
# Eine Datei öffnen
f = open("/tmp/foo.txt", "r")
for line in f:
print(line, end='')
# Die geöffnete Datei schließen
f.close()
Nach Ausführung des obigen Programms ist die Ausgabe:
Python 是一个非常好的语言。 是的,的确非常好!!
Diese Methode ist einfach, bietet aber keine sehr gute Kontrolle. Da die Verarbeitungsmechanismen der beiden unterschiedlich sind, sollte man sie am besten nicht miteinander vermischen.
f.write()
f.write(string) schreibt string in die Datei und gibt anschließend die Anzahl der geschriebenen Zeichen zurück.
Beispiel
# Eine Datei öffnen
f = open("/tmp/foo.txt", "w")
num = f.write( "Python ist eine sehr gute Sprache.\nJa, sie ist wirklich sehr gut!!\n" )
print(num)
# Die geöffnete Datei schließen
f.close()
Nach Ausführung des obigen Programms ist die Ausgabe:
29
Wenn Sie etwas schreiben möchten, das keine Zeichenkette ist, müssen Sie es zuerst konvertieren:
Beispiel
# Eine Datei öffnen
f = open("/tmp/foo1.txt", "w")
value = ('www.example.com', 14)
s = str(value)
f.write(s)
# Die geöffnete Datei schließen
f.close()
Öffnen Sie nach Ausführung des obigen Programms die Datei foo1.txt:
$ cat /tmp/foo1.txt
('www.example.com', 14)
f.tell()
f.tell() wird verwendet, um die aktuelle Lese-/Schreibposition der Datei zurückzugeben (d. h. die Position des Dateizeigers). Der Dateizeiger stellt den Byte-Offset vom Anfang der Datei dar. f.tell() gibt eine Ganzzahl zurück, die die aktuelle Position des Dateizeigers angibt.
f.seek()
Wenn Sie die aktuelle Position des Dateizeigers ändern möchten, können Sie die Funktion f.seek(offset, from_what) verwenden.
f.seek(offset, whence) wird verwendet, um den Dateizeiger an die angegebene Position zu verschieben.
offset gibt den Versatz relativ zum whence-Parameter an. Der Wert von from_what: Wenn er 0 ist, bedeutet das den Anfang; wenn er 1 ist, bedeutet das die aktuelle Position; 2 bedeutet das Ende der Datei. Zum Beispiel:
- seek(x,0): bewegt x Zeichen von der Startposition aus, d. h. das erste Zeichen der ersten Zeile der Datei.
- seek(x,1): bedeutet, x Zeichen von der aktuellen Position aus rückwärts zu verschieben.
- seek(-x,2): bedeutet, x Zeichen vom Ende der Datei aus rückwärts zu verschieben.
Der Standardwert von from_what ist 0, d. h. der Anfang der Datei. Ein vollständiges Beispiel ist unten angegeben:
>>> f.write(b'0123456789abcdef')
16
>>> f.seek(5) # Zum sechsten Byte der Datei springen
5
>>> f.read(1)
b'5'
>>> f.seek(-3, 2) # Zum dritten Byte vom Ende der Datei springen
13
>>> f.read(1)
b'd'
f.close()
In Textdateien (solchen, die in Modi ohne b geöffnet wurden), ist die Positionierung nur relativ zur Startposition der Datei möglich.
Wenn Sie die Verarbeitung einer Datei abgeschlossen haben, rufen Sie f.close() auf, um die Datei zu schließen und die Ressourcen des Systems freizugeben. Wenn Sie versuchen, die Datei erneut aufzurufen, wird eine Ausnahme ausgelöst.
>>> f.read()
Traceback (jüngster Aufruf zuletzt):
File "<stdin>", line 1, in ?
ValueError: E/A-Vorgang an geschlossener Datei
Wenn Sie mit einem Dateiobjekt arbeiten, ist die Verwendung des with-Schlüsselworts ein sehr guter Ansatz. Nach dem Abschluss wird die Datei für Sie korrekt geschlossen. Außerdem ist es kürzer zu schreiben als ein try-finally-Anweisungsblock:
... read_data = f.read()
>>> f.geschlossen
True
Dateiobjekte haben weitere Methoden wie isatty() und truncate(), aber diese werden normalerweise seltener verwendet.
Das pickle-Modul
Pythons pickle-Modul implementiert grundlegende Datenserialisierung und -deserialisierung.
Durch die Serialisierung mit dem pickle-Modul können wir die in einem Programm laufenden Objektinformationen in einer Datei zur dauerhaften Speicherung ablegen.
Durch die Deserialisierung mit dem pickle-Modul können wir das vom vorherigen Programm gespeicherte Objekt aus einer Datei erzeugen.
Grundlegende Schnittstelle:
pickle.dump(obj, file, [,protocol])
Mit diesem pickle-Objekt können Sie die Datei im Lesemodus öffnen:
x = pickle.load(file)
Hinweis:Liest eine Zeichenkette aus der Datei und rekonstruiert sie zum ursprünglichen Python-Objekt.
file:Ein dateiähnliches Objekt mit read()- und readline()-Schnittstellen.
Beispiel 1
import pickle
# Verwende das pickle-Modul, um das Datenobjekt in einer Datei zu speichern
data1 = {'a': [1, 2.0, 3, 4+6j],
'b': ('string', u'Unicode string'),
'c': Keine}
selfref_list = [1, 2, 3]
selfref_list.append(selfref_list)
output = open('data.pkl', 'wb')
# Dictionary mit Protokoll 0 pickeln.
pickle.dump(data1, output)
# Die Liste mit dem höchsten verfügbaren Protokoll pickeln.
pickle.dump(selfref_list, output, -1)
output.close()
Beispiel 2
import pprint, pickle
# Verwende das pickle-Modul, um das Python-Objekt aus einer Datei zu rekonstruieren
pkl_file = open('data.pkl', 'rb')
data1 = pickle.load(pkl_file)
pprint.pprint(data1)
data2 = pickle.load(pkl_file)
pprint.pprint(data2)
pkl_file.close()