io — Kernwerkzeuge für die Arbeit mit Streams¶
Quellcode: Lib/io.py
Übersicht¶
Das Modul io stellt die wichtigsten Einrichtungen von Python für den Umgang mit verschiedenen Arten von I/O bereit. Es gibt drei Hauptarten von I/O: *Text-I/O*, *Binär-I/O* und *Raw-I/O*. Dies sind allgemeine Kategorien, und für jede davon können verschiedene Backing-Stores verwendet werden. Ein konkretes Objekt, das zu einer dieser Kategorien gehört, wird als Datei-Objekt bezeichnet. Andere gängige Begriffe sind *Stream* und *dateiähnliches Objekt*.
Unabhängig von seiner Kategorie wird jedes konkrete Stream-Objekt auch verschiedene Fähigkeiten haben: Es kann nur lesbar, nur schreibbar oder les- und schreibbar sein. Es kann auch beliebigen wahlfreien Zugriff (Vor- oder Zurückspringen an jede beliebige Stelle) oder nur sequentiellen Zugriff (zum Beispiel im Fall eines Sockets oder einer Pipe) erlauben.
Alle Streams achten sorgfältig auf den Datentyp, den Sie ihnen übergeben. Zum Beispiel wird die Übergabe eines str-Objekts an die Methode write() eines binären Streams einen TypeError auslösen. Ebenso wird die Übergabe eines bytes-Objekts an die Methode write() eines Text-Streams einen TypeError auslösen.
Geändert in Version 3.3: Operationen, die früher IOError auslösten, lösen nun OSError aus, da IOError nun ein Alias für OSError ist.
Text-I/O¶
Text-I/O erwartet und liefert str-Objekte. Das bedeutet, dass immer dann, wenn der Backing-Store naturgemäß aus Bytes besteht (wie im Fall einer Datei), die Kodierung und Dekodierung von Daten sowie die optionale Übersetzung von plattformspezifischen Zeilenumbrüchen transparent erfolgen.
Der einfachste Weg, einen Text-Stream zu erstellen, ist die Verwendung von open(), wobei optional eine Kodierung angegeben wird
f = open("myfile.txt", "r", encoding="utf-8")
Speicherinterne Text-Streams sind auch als StringIO-Objekte verfügbar
f = io.StringIO("some initial text data")
Hinweis
Beim Arbeiten mit einem nicht-blockierenden Stream ist Vorsicht geboten, da Leseoperationen auf Text-I/O-Objekten einen BlockingIOError auslösen können, wenn der Stream die Operation nicht sofort ausführen kann.
Die API für Text-Streams ist in der Dokumentation von TextIOBase detailliert beschrieben.
Binär-I/O¶
Binär-I/O (auch *gepufferte I/O* genannt) erwartet bytes-ähnliche Objekte und liefert bytes-Objekte. Es erfolgt keine Kodierung, Dekodierung oder Zeilenumbruchübersetzung. Diese Kategorie von Streams kann für alle Arten von Nicht-Text-Daten verwendet werden, und auch dann, wenn eine manuelle Steuerung der Verarbeitung von Textdaten gewünscht ist.
Der einfachste Weg, einen Binär-Stream zu erstellen, ist die Verwendung von open() mit 'b' im Modus-String
f = open("myfile.jpg", "rb")
Speicherinterne Binär-Streams sind auch als BytesIO-Objekte verfügbar
f = io.BytesIO(b"some initial binary data: \x00\x01")
Die API für Binär-Streams ist in der Dokumentation von BufferedIOBase detailliert beschrieben.
Andere Bibliotheksmodule können zusätzliche Möglichkeiten zum Erstellen von Text- oder Binär-Streams bieten. Siehe zum Beispiel socket.socket.makefile().
Raw-I/O¶
Raw-I/O (auch *ungepufferte I/O* genannt) wird im Allgemeinen als Low-Level-Baustein für Binär- und Text-Streams verwendet; es ist selten sinnvoll, einen Raw-Stream direkt aus Benutzercode zu manipulieren. Dennoch können Sie einen Raw-Stream erstellen, indem Sie eine Datei im Binärmodus mit deaktivierter Pufferung öffnen
f = open("myfile.jpg", "rb", buffering=0)
Die API für Raw-Streams ist in der Dokumentation von RawIOBase detailliert beschrieben.
Textkodierung¶
Die Standardkodierung von TextIOWrapper und open() ist regionsspezifisch (locale.getencoding()).
Viele Entwickler vergessen jedoch, die Kodierung anzugeben, wenn sie Textdateien öffnen, die in UTF-8 kodiert sind (z. B. JSON, TOML, Markdown usw.), da die meisten Unix-Plattformen standardmäßig eine UTF-8-Region verwenden. Dies verursacht Fehler, da die Regionskodierung für die meisten Windows-Benutzer nicht UTF-8 ist. Zum Beispiel
# May not work on Windows when non-ASCII characters in the file.
with open("README.md") as f:
long_description = f.read()
Daher wird dringend empfohlen, beim Öffnen von Textdateien die Kodierung explizit anzugeben. Wenn Sie UTF-8 verwenden möchten, übergeben Sie encoding="utf-8". Um die aktuelle Regionskodierung zu verwenden, wird encoding="locale" seit Python 3.10 unterstützt.
Siehe auch
- Python UTF-8-Modus
Der Python UTF-8-Modus kann verwendet werden, um die Standardkodierung von regionsspezifischer Kodierung auf UTF-8 zu ändern.
- PEP 686
Python 3.15 wird den Python UTF-8-Modus standardmäßig aktivieren.
Opt-in EncodingWarning¶
Hinzugefügt in Version 3.10: Siehe PEP 597 für weitere Details.
Um herauszufinden, wo die Standard-Regionskodierung verwendet wird, können Sie die Kommandozeilenoption -X warn_default_encoding aktivieren oder die Umgebungsvariable PYTHONWARNDEFAULTENCODING setzen, was eine EncodingWarning ausgibt, wenn die Standardkodierung verwendet wird.
Wenn Sie eine API bereitstellen, die open() oder TextIOWrapper verwendet und encoding=None als Parameter übergibt, können Sie text_encoding() verwenden, damit Aufrufer der API eine EncodingWarning ausgeben, wenn sie keine encoding übergeben. Berücksichtigen Sie jedoch, dass Sie für neue APIs standardmäßig UTF-8 verwenden (d. h. encoding="utf-8").
High-Level-Modulschnittstelle¶
- io.DEFAULT_BUFFER_SIZE¶
Eine Ganzzahl, die die Standardpuffergröße enthält, die von den gepufferten I/O-Klassen des Moduls verwendet wird.
open()verwendet nach Möglichkeit die blksize der Datei (wie vonos.stat()erhalten).
- io.open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)¶
Dies ist ein Alias für die eingebaute Funktion
open().Diese Funktion löst ein Auditing-Ereignis
openmit den Argumenten path, mode und flags aus. Die Argumente mode und flags wurden möglicherweise aus dem ursprünglichen Aufruf geändert oder abgeleitet.
- io.open_code(path)¶
Öffnet die angegebene Datei mit dem Modus
'rb'. Diese Funktion sollte verwendet werden, wenn die Absicht besteht, den Inhalt als ausführbaren Code zu behandeln.path sollte ein
strund ein absoluter Pfad sein.Das Verhalten dieser Funktion kann durch einen früheren Aufruf von
PyFile_SetOpenCodeHook()überschrieben werden. Unter der Annahme, dass path einstrund ein absoluter Pfad ist, sollteopen_code(path)jedoch immer dasselbe verhalten wieopen(path, 'rb'). Das Überschreiben des Verhaltens ist für zusätzliche Validierung oder Vorverarbeitung der Datei gedacht.Hinzugefügt in Version 3.8.
- io.text_encoding(encoding, stacklevel=2, /)¶
Dies ist eine Hilfsfunktion für aufrufbare Objekte, die
open()oderTextIOWrapperverwenden und einen Parameterencoding=Nonehaben.Diese Funktion gibt encoding zurück, wenn es nicht
Noneist. Andernfalls gibt sie"locale"oder"utf-8"zurück, abhängig vom UTF-8-Modus.Diese Funktion löst eine
EncodingWarningaus, wennsys.flags.warn_default_encodingwahr ist und encodingNoneist. stacklevel gibt an, wo die Warnung ausgelöst wird. Zum Beispieldef read_text(path, encoding=None): encoding = io.text_encoding(encoding) # stacklevel=2 with open(path, encoding) as f: return f.read()
In diesem Beispiel wird eine
EncodingWarningfür den Aufrufer vonread_text()ausgegeben.Siehe Text Encoding für weitere Informationen.
Hinzugefügt in Version 3.10.
Geändert in Version 3.11:
text_encoding()gibt "utf-8" zurück, wenn der UTF-8-Modus aktiviert ist und encodingNoneist.
- exception io.BlockingIOError¶
Dies ist ein Kompatibilitäts-Alias für die eingebaute Ausnahme
BlockingIOError.
- exception io.UnsupportedOperation¶
Eine Ausnahme, die von
OSErrorundValueErrorerbt und ausgelöst wird, wenn eine nicht unterstützte Operation auf einem Stream aufgerufen wird.
Siehe auch
sysenthält die Standard-I/O-Streams:
sys.stdin,sys.stdoutundsys.stderr.
Klassenhierarchie¶
Die Implementierung von I/O-Streams ist als Hierarchie von Klassen organisiert. Zuerst *abstrakte Basisklassen* (ABCs), die zur Spezifizierung der verschiedenen Kategorien von Streams verwendet werden, dann konkrete Klassen, die die Standard-Stream-Implementierungen bereitstellen.
Hinweis
Die abstrakten Basisklassen bieten auch Standardimplementierungen einiger Methoden, um die Implementierung konkreter Stream-Klassen zu erleichtern. Zum Beispiel bietet BufferedIOBase nicht optimierte Implementierungen von readinto() und readline().
An der Spitze der I/O-Hierarchie steht die abstrakte Basisklasse IOBase. Sie definiert die grundlegende Schnittstelle zu einem Stream. Beachten Sie jedoch, dass es keine Trennung zwischen Lesen und Schreiben von Streams gibt; Implementierungen dürfen UnsupportedOperation auslösen, wenn sie eine bestimmte Operation nicht unterstützen.
Die ABC RawIOBase erweitert IOBase. Sie befasst sich mit dem Lesen und Schreiben von Bytes aus einem Stream. FileIO erbt von RawIOBase, um eine Schnittstelle zu Dateien im Dateisystem des Rechners bereitzustellen.
Die ABC BufferedIOBase erweitert IOBase. Sie befasst sich mit der Pufferung auf einem rohen Binärstream (RawIOBase). Ihre Unterklassen, BufferedWriter, BufferedReader und BufferedRWPair, puffern rohe Binärstreams, die schreibbar, lesbar oder beides sind. BufferedRandom bietet eine gepufferte Schnittstelle zu suchbaren Streams. Eine weitere Unterklasse von BufferedIOBase, BytesIO, ist ein Stream aus Bytes im Speicher.
Die ABC TextIOBase erweitert IOBase. Sie befasst sich mit Streams, deren Bytes Text darstellen, und behandelt die Kodierung und Dekodierung von und zu Strings. TextIOWrapper, das TextIOBase erweitert, ist eine gepufferte Textschnittstelle zu einem gepufferten Roh-Stream (BufferedIOBase). Schließlich ist StringIO ein Stream im Speicher für Text.
Argumentnamen sind nicht Teil der Spezifikation, und nur die Argumente von open() sind als Schlüsselwortargumente gedacht.
Die folgende Tabelle fasst die vom Modul io bereitgestellten ABCs zusammen
ABC |
Erbt von |
Stub-Methoden |
Mixin-Methoden und -Eigenschaften |
|---|---|---|---|
|
|
||
|
Geerbte Methoden von |
||
|
Geerbte Methoden von |
||
|
Geerbte Methoden von |
I/O-Basisklassen¶
- class io.IOBase¶
Die abstrakte Basisklasse für alle I/O-Klassen.
Diese Klasse stellt leere abstrakte Implementierungen für viele Methoden bereit, die von abgeleiteten Klassen selektiv überschrieben werden können; die Standardimplementierungen repräsentieren eine Datei, die nicht gelesen, geschrieben oder gesucht werden kann.
Obwohl
IOBaseread()oderwrite()nicht deklariert, da ihre Signaturen variieren werden, sollten Implementierungen und Clients diese Methoden als Teil der Schnittstelle betrachten. Außerdem können Implementierungen einenValueError(oderUnsupportedOperation) auslösen, wenn Operationen aufgerufen werden, die sie nicht unterstützen.Der grundlegende Typ für Binärdaten, die aus einer Datei gelesen oder in eine Datei geschrieben werden, ist
bytes. Andere bytes-ähnliche Objekte werden ebenfalls als Argumente für Methoden akzeptiert. Text-I/O-Klassen arbeiten mitstr-Daten.Beachten Sie, dass der Aufruf einer beliebigen Methode (auch Anfragen) für einen geschlossenen Stream undefiniert ist. Implementierungen können in diesem Fall einen
ValueErrorauslösen.IOBase(und seine Unterklassen) unterstützt das Iterator-Protokoll, was bedeutet, dass einIOBase-Objekt iteriert werden kann, um Zeilen in einem Stream zu liefern. Zeilen werden je nachdem, ob der Stream ein Binärstream (liefert Bytes) oder ein Textstream (liefert Zeichenketten) ist, geringfügig anders definiert. Siehereadline()unten.IOBaseist auch ein Kontextmanager und unterstützt daher diewith-Anweisung. In diesem Beispiel wird die Datei nach Abschluss des Suites derwith-Anweisung geschlossen – auch wenn ein Fehler auftrittwith open('spam.txt', 'w') as file: file.write('Spam and eggs!')
IOBasestellt diese Datenattribute und -methoden bereit- close()¶
Schließt und leert diesen Stream. Diese Methode hat keine Auswirkungen, wenn die Datei bereits geschlossen ist. Sobald die Datei geschlossen ist, löst jede Operation auf der Datei (z. B. Lesen oder Schreiben) einen
ValueErroraus.Als Komfortfunktion ist es erlaubt, diese Methode mehrmals aufzurufen; nur der erste Aufruf hat jedoch Auswirkungen.
- closed¶
True, wenn der Stream geschlossen ist.
- fileno()¶
Gibt den zugrunde liegenden Dateideskriptor (eine Ganzzahl) des Streams zurück, falls vorhanden. Ein
OSErrorwird ausgelöst, wenn das I/O-Objekt keinen Dateideskriptor verwendet.
- flush()¶
Leert die Schreibpuffer des Streams, falls zutreffend. Dies tut nichts für schreibgeschützte und nicht-blockierende Streams.
- isatty()¶
Gibt
Truezurück, wenn der Stream interaktiv ist (d. h. mit einem Terminal/tty-Gerät verbunden).
- readable()¶
Gibt
Truezurück, wenn der Stream gelesen werden kann. WennFalse, löstread()einenOSErroraus.
- readline(size=-1, /)¶
Liest und gibt eine Zeile aus dem Stream zurück. Wenn size angegeben ist, werden höchstens size Bytes gelesen.
Der Zeilenabschluss ist immer
b'\n'für Binärdateien; für Textdateien kann das newline-Argument vonopen()verwendet werden, um die erkannten Zeilenabschlüsse auszuwählen.
- readlines(hint=-1, /)¶
Liest und gibt eine Liste von Zeilen aus dem Stream zurück. hint kann angegeben werden, um die Anzahl der gelesenen Zeilen zu steuern: Es werden keine weiteren Zeilen gelesen, wenn die Gesamtgröße (in Bytes/Zeichen) aller bisherigen Zeilen hint überschreitet.
hint-Werte von
0oder kleiner sowieNonewerden als kein Hinweis behandelt.Beachten Sie, dass es bereits möglich ist, über Datei-Objekte zu iterieren, indem man
for line in file: ...verwendet, ohnefile.readlines()aufzurufen.
- seek(offset, whence=os.SEEK_SET, /)¶
Ändert die Stream-Position auf den gegebenen offset in Bytes, interpretiert relativ zur von whence angegebenen Position, und gibt die neue absolute Position zurück. Werte für whence sind
os.SEEK_SEToder0– Anfang des Streams (Standard); offset sollte null oder positiv seinos.SEEK_CURoder1– aktuelle Stream-Position; offset kann negativ seinos.SEEK_ENDoder2– Ende des Streams; offset ist normalerweise negativ
Hinzugefügt in Version 3.1: Die Konstanten
SEEK_*.Hinzugefügt in Version 3.3: Einige Betriebssysteme können zusätzliche Werte unterstützen, wie z. B.
os.SEEK_HOLEoderos.SEEK_DATA. Die gültigen Werte für eine Datei können davon abhängen, ob sie im Text- oder Binärmodus geöffnet ist.
- seekable()¶
Gibt
Truezurück, wenn der Stream zufälligen Zugriff unterstützt. WennFalse, lösenseek(),tell()undtruncate()eineOSErroraus.
- tell()¶
Gibt die aktuelle Stream-Position zurück.
- truncate(size=None, /)¶
Größe des Streams auf die gegebene size in Bytes (oder die aktuelle Position, wenn size nicht angegeben ist) ändern. Die aktuelle Stream-Position wird nicht geändert. Diese Größenänderung kann die aktuelle Dateigröße erweitern oder verringern. Im Falle einer Erweiterung hängen die Inhalte des neuen Datei-Bereichs vom System ab (auf den meisten Systemen werden zusätzliche Bytes mit Nullen gefüllt). Die neue Dateigröße wird zurückgegeben.
Geändert in Version 3.5: Windows wird Dateien beim Erweitern jetzt mit Nullen füllen.
- writable()¶
Gibt
Truezurück, wenn der Stream Schreibzugriff unterstützt. WennFalse, lösenwrite()undtruncate()eineOSErroraus.
- writelines(lines, /)¶
Schreibt eine Liste von Zeilen in den Stream. Zeilentrenner werden nicht hinzugefügt, daher ist es üblich, dass jede der bereitgestellten Zeilen am Ende einen Zeilentrenner hat.
- class io.RawIOBase¶
Basisklasse für rohe Binärströme. Sie erbt von
IOBase.Rohe Binärströme bieten typischerweise Low-Level-Zugriff auf ein zugrundeliegendes OS-Gerät oder eine API und versuchen nicht, es in High-Level-Primitive zu kapseln (diese Funktionalität wird auf höherer Ebene in gepufferten Binärströmen und Textströmen durchgeführt, die später auf dieser Seite beschrieben werden).
RawIOBasestellt zusätzlich zu den Methoden vonIOBasediese Methoden zur Verfügung- read(size=-1, /)¶
Liest bis zu size Bytes aus dem Objekt und gibt diese zurück. Als Komfortfunktion, wenn size nicht angegeben oder -1 ist, werden alle Bytes bis zum EOF zurückgegeben. Andernfalls wird nur ein einziger Systemaufruf durchgeführt. Weniger als size Bytes können zurückgegeben werden, wenn der Betriebssystemaufruf weniger als size Bytes zurückgibt.
Wenn 0 Bytes zurückgegeben werden und size nicht 0 war, bedeutet dies das Ende der Datei. Wenn das Objekt im nicht-blockierenden Modus ist und keine Bytes verfügbar sind, wird
Nonezurückgegeben.Die Standardimplementierung leitet an
readall()undreadinto()weiter.
- readall()¶
Liest und gibt alle Bytes aus dem Stream bis zum EOF zurück, wobei bei Bedarf mehrere Aufrufe des Streams erfolgen.
- readinto(b, /)¶
Liest Bytes in ein vorab zugewiesenes, beschreibbares bytes-ähnliches Objekt b und gibt die Anzahl der gelesenen Bytes zurück. Zum Beispiel könnte b ein
bytearraysein. Wenn das Objekt im nicht-blockierenden Modus ist und keine Bytes verfügbar sind, wirdNonezurückgegeben.
- write(b, /)¶
Schreibt das gegebene bytes-ähnliche Objekt, b, in den zugrundeliegenden rohen Stream und gibt die Anzahl der geschriebenen Bytes zurück. Dies kann weniger sein als die Länge von b in Bytes, abhängig von den Besonderheiten des zugrundeliegenden rohen Streams, insbesondere wenn er im nicht-blockierenden Modus ist.
Nonewird zurückgegeben, wenn der rohe Stream nicht blockiert ist und kein einzelnes Byte sofort hineingeschrieben werden konnte. Der Aufrufer kann b nach Rückgabe dieser Methode freigeben oder ändern, daher sollte die Implementierung b nur während des Methodenaufrufs zugreifen.
- class io.BufferedIOBase¶
Basisklasse für Binärströme, die eine Art Pufferung unterstützen. Sie erbt von
IOBase.Der Hauptunterschied zu
RawIOBaseist, dass die Methodenread(),readinto()undwrite()versuchen werden, (respektive) so viel Eingabe wie angefordert zu lesen oder alle bereitgestellten Daten auszugeben.Zusätzlich wird, wenn der zugrundeliegende rohe Stream im nicht-blockierenden Modus ist und das System beim Zurückgeben blockieren würde,
write()eineBlockingIOErrormitBlockingIOError.characters_writtenauslösen undread()bisher gelesene Daten oderNonezurückgeben, wenn keine Daten verfügbar sind.Außerdem hat die Methode
read()keine Standardimplementierung, die anreadinto()weiterleitet.Eine typische Implementierung von
BufferedIOBasesollte nicht von einer Implementierung vonRawIOBaseerben, sondern diese umschließen, wie es z. B.BufferedWriterundBufferedReadertun.BufferedIOBasestellt zusätzlich zu den Datenattributen und Methoden vonIOBasediese zur Verfügung- raw¶
Der zugrundeliegende rohe Stream (eine Instanz von
RawIOBase), mit demBufferedIOBasearbeitet. Dies ist kein Teil derBufferedIOBaseAPI und existiert möglicherweise nicht bei einigen Implementierungen.
- detach()¶
Trennt den zugrundeliegenden rohen Stream vom Puffer und gibt ihn zurück.
Nachdem der rohe Stream getrennt wurde, ist der Puffer in einem unbrauchbaren Zustand.
Einige Puffer, wie z. B.
BytesIO, haben kein Konzept eines einzelnen rohen Streams, der von dieser Methode zurückgegeben wird. Sie lösen eineUnsupportedOperationaus.Hinzugefügt in Version 3.1.
- read(size=-1, /)¶
Liest und gibt bis zu size Bytes zurück. Wenn das Argument weggelassen wird,
Noneist oder negativ ist, wird so viel wie möglich gelesen.Weniger Bytes als angefordert können zurückgegeben werden. Ein leerer
bytes-Objekt wird zurückgegeben, wenn der Stream bereits am EOF ist. Es können mehr als ein Lesevorgang durchgeführt und Aufrufe wiederholt werden, wenn bestimmte Fehler auftreten, sieheos.read()und PEP 475 für weitere Details. Weniger als size Bytes zurückzugeben bedeutet nicht, dass das EOF unmittelbar bevorsteht.Beim Lesen so vieler Daten wie möglich verwendet die Standardimplementierung
raw.readall, falls verfügbar (wasRawIOBase.readall()implementieren sollte), andernfalls wird in einer Schleife gelesen, bis readNone, leerebytesoder ein nicht wiederholbarer Fehler zurückgibt. Für die meisten Streams ist dies bis zum EOF, aber für nicht-blockierende Streams können mehr Daten verfügbar werden.Hinweis
Wenn der zugrundeliegende rohe Stream nicht blockierend ist, können Implementierungen entweder
BlockingIOErrorauslösen oderNonezurückgeben, wenn keine Daten verfügbar sind.io-Implementierungen gebenNonezurück.
- read1(size=-1, /)¶
Liest und gibt bis zu size Bytes zurück, wobei
readinto()aufgerufen wird, was beiEINTRgemäß PEP 475 wiederholt werden kann. Wenn size-1ist oder nicht angegeben wird, wählt die Implementierung einen beliebigen Wert für size.Hinweis
Wenn der zugrundeliegende rohe Stream nicht blockierend ist, können Implementierungen entweder
BlockingIOErrorauslösen oderNonezurückgeben, wenn keine Daten verfügbar sind.io-Implementierungen gebenNonezurück.
- readinto(b, /)¶
Liest Bytes in ein vorab zugewiesenes, beschreibbares bytes-ähnliches Objekt b und gibt die Anzahl der gelesenen Bytes zurück. Zum Beispiel könnte b ein
bytearraysein.Wie bei
read()können mehrere Lesevorgänge auf dem zugrundeliegenden rohen Stream ausgeführt werden, es sei denn, letzterer ist interaktiv.Eine
BlockingIOErrorwird ausgelöst, wenn der zugrundeliegende rohe Stream im nicht-blockierenden Modus ist und zu diesem Zeitpunkt keine Daten verfügbar sind.
- readinto1(b, /)¶
Liest Bytes in ein vorab zugewiesenes, beschreibbares bytes-ähnliches Objekt b, wobei höchstens ein Aufruf der
read()-Methode (oderreadinto()) des zugrundeliegenden rohen Streams verwendet wird. Gibt die Anzahl der gelesenen Bytes zurück.Eine
BlockingIOErrorwird ausgelöst, wenn der zugrundeliegende rohe Stream im nicht-blockierenden Modus ist und zu diesem Zeitpunkt keine Daten verfügbar sind.Hinzugefügt in Version 3.5.
- write(b, /)¶
Schreibt das gegebene bytes-ähnliche Objekt, b, und gibt die Anzahl der geschriebenen Bytes zurück (immer gleich der Länge von b in Bytes, da bei einem Schreibfehler eine
OSErrorausgelöst wird). Je nach tatsächlicher Implementierung können diese Bytes sofort in den zugrundeliegenden Stream geschrieben oder aus Leistungs- und Latenzgründen in einem Puffer gehalten werden.Im nicht-blockierenden Modus wird eine
BlockingIOErrorausgelöst, wenn die Daten in den rohen Stream geschrieben werden mussten, dieser aber nicht alle Daten ohne Blockieren aufnehmen konnte.Der Aufrufer kann b nach Rückgabe dieser Methode freigeben oder ändern, daher sollte die Implementierung b nur während des Methodenaufrufs zugreifen.
Rohdatenein-/ausgabe (Raw File I/O)¶
- class io.FileIO(name, mode='r', closefd=True, opener=None)¶
Ein roher Binärstream, der eine Datei auf OS-Ebene darstellt und Bytes-Daten enthält. Er erbt von
RawIOBase.Der name kann eines von zwei Dingen sein
ein Zeichenstring oder ein
bytes-Objekt, das den Pfad zur zu öffnenden Datei darstellt. In diesem Fall muss closefdTrue(Standard) sein, andernfalls wird ein Fehler ausgelöst.eine Ganzzahl, die die Nummer eines vorhandenen Dateideskriptors auf OS-Ebene darstellt, auf den das resultierende
FileIO-Objekt Zugriff gibt. Wenn das FileIO-Objekt geschlossen wird, wird dieser fd ebenfalls geschlossen, es sei denn, closefd ist aufFalsegesetzt.
Der mode kann
'r','w','x'oder'a'für Lesen (Standard), Schreiben, exklusives Erstellen oder Anhängen sein. Die Datei wird erstellt, wenn sie beim Öffnen zum Schreiben oder Anhängen nicht existiert; sie wird beim Öffnen zum Schreiben abgeschnitten.FileExistsErrorwird ausgelöst, wenn sie beim Öffnen zum Erstellen bereits existiert. Das Öffnen einer Datei zum Erstellen impliziert Schreiben, daher verhält sich dieser Modus ähnlich wie'w'. Fügen Sie ein'+'zum Modus hinzu, um gleichzeitiges Lesen und Schreiben zu ermöglichen.Die Methoden
read()(wenn mit einem positiven Argument aufgerufen),readinto()undwrite()dieser Klasse führen nur einen einzigen Systemaufruf durch.Ein benutzerdefinierter Opener kann durch Übergabe eines aufrufbaren Objekts als opener verwendet werden. Der zugrundeliegende Dateideskriptor für das Datei-Objekt wird dann durch Aufrufen von opener mit (name, flags) erhalten. opener muss einen geöffneten Dateideskriptor zurückgeben (das Übergeben von
os.openals opener führt zu einer Funktionalität, die der Übergabe vonNoneähnelt).Die neu erstellte Datei ist nicht erblich.
Siehe die integrierte Funktion
open()für Beispiele zur Verwendung des opener-Parameters.Geändert in Version 3.3: Der Parameter opener wurde hinzugefügt. Der Modus
'x'wurde hinzugefügt.Geändert in Version 3.4: Die Datei ist jetzt nicht erblich.
FileIOstellt zusätzlich zu den Datenattributen vonRawIOBaseundIOBasediese Datenattribute zur Verfügung- mode¶
Der Modus, wie er im Konstruktor angegeben wurde.
- name¶
Der Dateiname. Dies ist der Dateideskriptor der Datei, wenn im Konstruktor kein Name angegeben wurde.
Gepufferte Streams¶
Gepufferte E/A-Streams bieten eine höherrangige Schnittstelle zu einem E/A-Gerät als reine E/A.
- class io.BytesIO(initial_bytes=b'')¶
Ein binärer Stream, der einen In-Memory-Byte-Puffer verwendet. Er erbt von
BufferedIOBase. Der Puffer wird verworfen, wenn die Methodeclose()aufgerufen wird.Das optionale Argument initial_bytes ist ein byte-ähnliches Objekt, das die anfänglichen Daten enthält.
BytesIOstellt diese Methoden zusätzlich zu denen vonBufferedIOBaseundIOBasebereit oder überschreibt sie.- getbuffer()¶
Gibt eine lesbare und schreibbare Ansicht des Pufferinhalts zurück, ohne diesen zu kopieren. Das Verändern der Ansicht aktualisiert auch transparent den Pufferinhalt.
>>> b = io.BytesIO(b"abcdef") >>> view = b.getbuffer() >>> view[2:4] = b"56" >>> b.getvalue() b'ab56ef'
Hinweis
Solange die Ansicht existiert, kann das
BytesIO-Objekt nicht in der Größe verändert oder geschlossen werden.Hinzugefügt in Version 3.2.
- read1(size=-1, /)¶
In
BytesIOist dies dasselbe wieread().Geändert in Version 3.7: Das Argument size ist jetzt optional.
- readinto1(b, /)¶
In
BytesIOist dies dasselbe wiereadinto().Hinzugefügt in Version 3.5.
- class io.BufferedReader(raw, buffer_size=DEFAULT_BUFFER_SIZE)¶
Ein gepufferter binärer Stream, der höherrangigen Zugriff auf einen lesbaren, nicht suchbaren
RawIOBase-Rohdatentrommel bietet. Er erbt vonBufferedIOBase.Beim Lesen von Daten aus diesem Objekt kann eine größere Datenmenge vom zugrunde liegenden Rohstream angefordert und in einem internen Puffer gespeichert werden. Die gepufferten Daten können dann bei nachfolgenden Lesevorgängen direkt zurückgegeben werden.
Der Konstruktor erstellt einen
BufferedReaderfür den gegebenen lesbaren raw Stream und die buffer_size. Wenn buffer_size weggelassen wird, wirdDEFAULT_BUFFER_SIZEverwendet.BufferedReaderstellt diese Methoden zusätzlich zu denen vonBufferedIOBaseundIOBasebereit oder überschreibt sie.- peek(size=0, /)¶
Gibt Bytes aus dem Stream zurück, ohne die Position zu verändern. Die Anzahl der zurückgegebenen Bytes kann kleiner oder größer als die angeforderte sein. Wenn der zugrunde liegende Rohstream nicht blockierend ist und die Operation blockieren würde, werden leere Bytes zurückgegeben.
- read(size=-1, /)¶
In
BufferedReaderist dies dasselbe wieio.BufferedIOBase.read().
- read1(size=-1, /)¶
In
BufferedReaderist dies dasselbe wieio.BufferedIOBase.read1().Geändert in Version 3.7: Das Argument size ist jetzt optional.
- class io.BufferedWriter(raw, buffer_size=DEFAULT_BUFFER_SIZE)¶
Ein gepufferter binärer Stream, der höherrangigen Zugriff auf einen schreibbaren, nicht suchbaren
RawIOBase-Rohdatentrommel bietet. Er erbt vonBufferedIOBase.Beim Schreiben auf dieses Objekt werden Daten normalerweise in einen internen Puffer geschrieben. Der Puffer wird unter verschiedenen Bedingungen in das zugrunde liegende
RawIOBase-Objekt geschrieben, einschließlichwenn der Puffer zu klein für alle ausstehenden Daten wird;
wenn
flush()aufgerufen wird;wenn ein
seek()angefordert wird (fürBufferedRandom-Objekte);wenn das
BufferedWriter-Objekt geschlossen oder zerstört wird.
Der Konstruktor erstellt einen
BufferedWriterfür den gegebenen schreibbaren raw Stream. Wenn die buffer_size nicht angegeben ist, ist sie standardmäßigDEFAULT_BUFFER_SIZE.BufferedWriterstellt diese Methoden zusätzlich zu denen vonBufferedIOBaseundIOBasebereit oder überschreibt sie.- flush()¶
Erzwingt das Schreiben von Bytes aus dem Puffer in den Rohstream. Ein
BlockingIOErrorsollte ausgelöst werden, wenn der Rohstream blockiert.
- write(b, /)¶
Schreibt das byte-ähnliche Objekt b und gibt die Anzahl der geschriebenen Bytes zurück. Im nicht-blockierenden Modus wird eine
BlockingIOErrormit gesetztem AttributBlockingIOError.characters_writtenausgelöst, wenn der Puffer ausgegeben werden muss, aber der Rohstream blockiert.
- class io.BufferedRandom(raw, buffer_size=DEFAULT_BUFFER_SIZE)¶
Ein gepufferter binärer Stream, der höherrangigen Zugriff auf einen suchbaren
RawIOBase-Rohdatentrommel bietet. Er erbt vonBufferedReaderundBufferedWriter.Der Konstruktor erstellt einen Leser und Schreiber für einen suchbaren Rohstream, der im ersten Argument übergeben wird. Wenn die buffer_size weggelassen wird, ist sie standardmäßig
DEFAULT_BUFFER_SIZE.BufferedRandomist zu allem fähig, wasBufferedReaderoderBufferedWritertun können. Zusätzlich sindseek()undtell()garantiert implementiert.
- class io.BufferedRWPair(reader, writer, buffer_size=DEFAULT_BUFFER_SIZE, /)¶
Ein gepufferter binärer Stream, der höherrangigen Zugriff auf zwei nicht suchbare
RawIOBase-Rohdatentrommel bietet – eine lesbar, die andere schreibbar. Er erbt vonBufferedIOBase.reader und writer sind
RawIOBase-Objekte, die jeweils lesbar und schreibbar sind. Wenn die buffer_size weggelassen wird, ist sie standardmäßigDEFAULT_BUFFER_SIZE.BufferedRWPairimplementiert alle Methoden vonBufferedIOBasemit Ausnahme vondetach(), was eineUnsupportedOperationauslöst.Warnung
BufferedRWPairversucht nicht, Zugriffe auf seine zugrunde liegenden Rohstreams zu synchronisieren. Sie sollten nicht dasselbe Objekt als Leser und Schreiber übergeben; verwenden Sie stattdessenBufferedRandom.
Text-E/A¶
- class io.TextIOBase¶
Basisklasse für Textstreams. Diese Klasse bietet eine Zeichen- und zeilenbasierte Schnittstelle zu Stream-E/A. Sie erbt von
IOBase.TextIOBasestellt diese Datenattribute und Methoden zusätzlich zu denen vonIOBasebereit oder überschreibt sie.- encoding¶
Der Name der Kodierung, die verwendet wird, um die Bytes des Streams in Zeichenketten zu dekodieren und Zeichenketten in Bytes zu kodieren.
- errors¶
Die Fehlereinstellung des Dekoders oder Kodierers.
- newlines¶
Eine Zeichenkette, ein Tupel von Zeichenketten oder
None, die die bisher übersetzten Zeilenumbrüche angibt. Abhängig von der Implementierung und den anfänglichen Konstruktorflags ist dies möglicherweise nicht verfügbar.
- buffer¶
Der zugrunde liegende binäre Puffer (eine Instanz von
BufferedIOBaseoderRawIOBase), mit demTextIOBasearbeitet. Dies ist kein Teil der API vonTextIOBaseund möglicherweise nicht in allen Implementierungen vorhanden.
- detach()¶
Trenne den zugrunde liegenden binären Puffer vom
TextIOBaseund gib ihn zurück.Nachdem der zugrunde liegende Puffer getrennt wurde, befindet sich der
TextIOBasein einem unbrauchbaren Zustand.Einige
TextIOBase-Implementierungen, wie z. B.StringIO, haben möglicherweise kein Konzept eines zugrunde liegenden Puffers, und das Aufrufen dieser Methode löst eineUnsupportedOperationaus.Hinzugefügt in Version 3.1.
- read(size=-1, /)¶
Liest und gibt höchstens size Zeichen aus dem Stream als einzelne
strzurück. Wenn size negativ oderNoneist, wird bis zum Ende der Datei gelesen.
- readline(size=-1, /)¶
Liest bis zu einem Zeilenumbruch oder dem Ende der Datei und gibt eine einzelne
strzurück. Wenn der Stream bereits am Ende der Datei ist, wird eine leere Zeichenkette zurückgegeben.Wenn size angegeben ist, werden höchstens size Zeichen gelesen.
- seek(offset, whence=SEEK_SET, /)¶
Ändert die Stream-Position auf den angegebenen offset. Das Verhalten hängt vom Parameter whence ab. Der Standardwert für whence ist
SEEK_SET.SEEK_SEToder0: sucht vom Anfang des Streams aus (Standard); offset muss entweder eine Zahl sein, die vonTextIOBase.tell()zurückgegeben wurde, oder Null. Jeder andere offset-Wert führt zu undefiniertem Verhalten.SEEK_CURoder1: sucht zur aktuellen Position; offset muss Null sein, was eine No-Operation ist (alle anderen Werte werden nicht unterstützt).SEEK_ENDoder2: sucht zum Ende des Streams; offset muss Null sein (alle anderen Werte werden nicht unterstützt).
Gibt die neue absolute Position als undurchsichtige Zahl zurück.
Hinzugefügt in Version 3.1: Die Konstanten
SEEK_*.
- tell()¶
Gibt die aktuelle Stream-Position als undurchsichtige Zahl zurück. Die Zahl stellt normalerweise keine Anzahl von Bytes im zugrunde liegenden binären Speicher dar.
- write(s, /)¶
Schreibt die Zeichenkette s in den Stream und gibt die Anzahl der geschriebenen Zeichen zurück.
- class io.TextIOWrapper(buffer, encoding=None, errors=None, newline=None, line_buffering=False, write_through=False)¶
Ein gepufferter Textstream, der höherrangigen Zugriff auf einen
BufferedIOBase-gepufferten Binärstream bietet. Er erbt vonTextIOBase.encoding gibt den Namen der Kodierung an, mit der der Stream dekodiert oder kodiert wird. Im UTF-8-Modus ist dies standardmäßig UTF-8. Andernfalls ist es standardmäßig
locale.getencoding().encoding="locale"kann verwendet werden, um explizit die Kodierung des aktuellen Gebietsschemas anzugeben. Siehe Text-Kodierung für weitere Informationen.errors ist eine optionale Zeichenkette, die angibt, wie Kodierungs- und Dekodierungsfehler behandelt werden sollen. Übergeben Sie
'strict', um eine Ausnahme vom TypValueErrorauszulösen, wenn ein Kodierungsfehler auftritt (der Standardwert vonNonehat die gleiche Wirkung), oder übergeben Sie'ignore', um Fehler zu ignorieren. (Beachten Sie, dass das Ignorieren von Kodierungsfehlern zu Datenverlust führen kann.)'replace'ersetzt fehlerhafte Daten durch ein Ersatzzeichen (wie z. B.'?').'backslashreplace'ersetzt fehlerhafte Daten durch eine Backslash-Escape-Sequenz. Beim Schreiben können'xmlcharrefreplace'(ersetzen durch die entsprechende XML-Zeichenreferenz) oder'namereplace'(ersetzen durch\N{...}-Escape-Sequenzen) verwendet werden. Jeder andere Fehlerbehandlungsname, der beicodecs.register_error()registriert wurde, ist ebenfalls gültig.newline steuert, wie Zeilenenden behandelt werden. Es kann
None,'','\n','\r'und'\r\n'sein. Es funktioniert wie folgt:Beim Lesen von Eingaben aus dem Stream, wenn newline
Noneist, wird der Modus für universelle Zeilenumbrüche aktiviert. Zeilen in der Eingabe können mit'\n','\r'oder'\r\n'enden, und diese werden in'\n'übersetzt, bevor sie an den Aufrufer zurückgegeben werden. Wenn newline''ist, wird der Modus für universelle Zeilenumbrüche aktiviert, aber die Zeilenenden werden unverändert an den Aufrufer zurückgegeben. Wenn newline einen der anderen gültigen Werte hat, werden Eingabezeilen nur durch die angegebene Zeichenkette beendet, und das Zeilenende wird unverändert an den Aufrufer zurückgegeben.Beim Schreiben von Ausgaben in den Stream, wenn newline
Noneist, werden alle geschriebenen'\n'-Zeichen in den systemweiten Standard-Zeilentrenneros.linesepübersetzt. Wenn newline''oder'\n'ist, findet keine Übersetzung statt. Wenn newline einer der anderen gültigen Werte ist, werden alle geschriebenen'\n'-Zeichen in die angegebene Zeichenkette übersetzt.
Wenn line_buffering
Trueist, wirdflush()impliziert, wenn ein Schreibaufruf ein Zeilenumbruchszeichen oder ein Wagenrücklaufzeichen enthält.Wenn write_through
Trueist, wird garantiert, dass Aufrufe vonwrite()nicht gepuffert werden: Alle auf dasTextIOWrapper-Objekt geschriebenen Daten werden sofort an den zugrunde liegenden binären buffer weitergeleitet.Geändert in Version 3.3: Das Argument write_through wurde hinzugefügt.
Geändert in Version 3.3: Die Standard-encoding ist jetzt
locale.getpreferredencoding(False)anstelle vonlocale.getpreferredencoding(). Ändere nicht temporär die Locale-Kodierung mitlocale.setlocale(), verwende stattdessen die aktuelle Locale-Kodierung anstelle der bevorzugten Benutzerkodierung.Geändert in Version 3.10: Das Argument encoding unterstützt jetzt den Dummy-Encoding-Namen
"locale".Hinweis
Wenn der zugrunde liegende Rohstream nicht blockierend ist, kann eine
BlockingIOErrorausgelöst werden, wenn eine Leseoperation nicht sofort abgeschlossen werden kann.TextIOWrapperstellt zusätzlich zu den Attributen und Methoden vonTextIOBaseundIOBasedie folgenden Datenattribute und Methoden bereit:- line_buffering¶
Gibt an, ob die Zeilenpufferung aktiviert ist.
- write_through¶
Gibt an, ob Schreibvorgänge sofort an den zugrunde liegenden Binärpuffer weitergeleitet werden.
Hinzugefügt in Version 3.7.
- reconfigure(*, encoding=None, errors=None, newline=None, line_buffering=None, write_through=None)¶
Konfiguriert diesen Textstrom mit neuen Einstellungen für encoding, errors, newline, line_buffering und write_through neu.
Nicht angegebene Parameter behalten die aktuellen Einstellungen bei, außer dass
errors='strict'verwendet wird, wenn encoding angegeben ist, errors jedoch nicht.Es ist nicht möglich, die Codierung oder neue Zeilen zu ändern, wenn bereits Daten aus dem Stream gelesen wurden. Das Ändern der Codierung nach dem Schreiben ist jedoch möglich.
Diese Methode führt vor dem Setzen der neuen Parameter einen impliziten Stream-Flush durch.
Hinzugefügt in Version 3.7.
Geändert in Version 3.11: Die Methode unterstützt die Option
encoding="locale".
- seek(cookie, whence=os.SEEK_SET, /)¶
Setzt die Stream-Position. Gibt die neue Stream-Position als
intzurück.Vier Operationen werden unterstützt, gegeben durch die folgenden Argumentkombinationen:
seek(0, SEEK_SET): Spult zum Anfang des Streams zurück.seek(cookie, SEEK_SET): Stellt eine frühere Position wieder her; cookie **muss** eine Zahl sein, die vontell()zurückgegeben wurde.seek(0, SEEK_END): Springt zum Ende des Streams.seek(0, SEEK_CUR): Lässt die aktuelle Stream-Position unverändert.
Jede andere Argumentkombination ist ungültig und kann Ausnahmen auslösen.
Siehe auch
- class io.StringIO(initial_value='', newline='\n')¶
Ein Textstrom, der einen In-Memory-Textpuffer verwendet. Er erbt von
TextIOBase.Der Textpuffer wird verworfen, wenn die Methode
close()aufgerufen wird.Der Anfangswert des Puffers kann durch Angabe von initial_value festgelegt werden. Wenn die Zeilenumbruchübersetzung aktiviert ist, werden Zeilenumbrüche wie durch
write()codiert. Der Stream wird am Anfang des Puffers positioniert, was dem Öffnen einer vorhandenen Datei im Modusw+ähnelt und ihn für ein sofortiges Schreiben von Anfang an oder für ein Schreiben, das den Anfangswert überschreiben würde, bereit macht. Um das Öffnen einer Datei im Modusa+zum Anhängen vorzubereiten, verwenden Sief.seek(0, io.SEEK_END), um den Stream an das Ende des Puffers zu positionieren.Das Argument newline funktioniert ähnlich wie bei
TextIOWrapper, mit der Ausnahme, dass bei der Ausgabe in den Stream, wenn newlineNoneist, Zeilenumbrüche auf allen Plattformen als\ngeschrieben werden.StringIOstellt diese Methode zusätzlich zu den Methoden vonTextIOBaseundIOBasebereit:- getvalue()¶
Gibt einen
strmit dem gesamten Inhalt des Puffers zurück. Zeilenumbrüche werden wie durchread()dekodiert, obwohl die Stream-Position nicht geändert wird.
Beispielverwendung
import io output = io.StringIO() output.write('First line.\n') print('Second line.', file=output) # Retrieve file contents -- this will be # 'First line.\nSecond line.\n' contents = output.getvalue() # Close object and discard memory buffer -- # .getvalue() will now raise an exception. output.close()
- class io.IncrementalNewlineDecoder¶
Ein Hilfscodec, der Zeilenumbrüche für den Modus der universellen Zeilenumbrüche dekodiert. Er erbt von
codecs.IncrementalDecoder.
Statische Typisierung¶
Die folgenden Protokolle können zur Annotation von Funktions- und Methodenargumenten für einfache Lese- oder Schreiboperationen auf Streams verwendet werden. Sie sind mit @typing.runtime_checkable dekoriert.
- class io.Reader[T]¶
Generisches Protokoll zum Lesen aus einer Datei oder einem anderen Eingabestrom.
Tist normalerweisestroderbytes, kann aber jeder Typ sein, der aus dem Strom gelesen wird.Hinzugefügt in Version 3.14.
- read()¶
- read(size, /)
Liest Daten aus dem Eingabestrom und gibt sie zurück. Wenn size angegeben ist, sollte es eine Ganzzahl sein, und es werden höchstens size Elemente (Bytes/Zeichen) gelesen.
Zum Beispiel
def read_it(reader: Reader[str]): data = reader.read(11) assert isinstance(data, str)
- class io.Writer[T]¶
Generisches Protokoll zum Schreiben in eine Datei oder einen anderen Ausgabestrom.
Tist normalerweisestroderbytes, kann aber jeder Typ sein, der in den Stream geschrieben werden kann.Hinzugefügt in Version 3.14.
- write(data, /)¶
Schreibt data in den Ausgabestrom und gibt die Anzahl der geschriebenen Elemente (Bytes/Zeichen) zurück.
Zum Beispiel
def write_binary(writer: Writer[bytes]): writer.write(b"Hello world!\n")
Weitere I/O-bezogene Protokolle und Klassen, die für die statische Typüberprüfung verwendet werden können, finden Sie unter ABCs und Protokolle zur Arbeit mit I/O.
Leistung¶
Dieser Abschnitt diskutiert die Leistung der bereitgestellten konkreten I/O-Implementierungen.
Binäre I/O¶
Durch das Lesen und Schreiben nur großer Datenblöcke, auch wenn der Benutzer ein einzelnes Byte anfordert, verbirgt die Puffer-I/O etwaige Ineffizienzen beim Aufruf und der Ausführung der ungepufferten I/O-Routinen des Betriebssystems. Der Gewinn hängt vom Betriebssystem und der Art der durchgeführten I/O ab. Auf einigen modernen Betriebssystemen wie Linux kann ungepufferte Festplatten-I/O genauso schnell sein wie gepufferte I/O. Letztendlich bietet gepufferte I/O jedoch eine vorhersagbare Leistung unabhängig von der Plattform und dem zugrunde liegenden Gerät. Daher ist es fast immer vorzuziehen, gepufferte I/O anstelle von ungepufferter I/O für Binärdaten zu verwenden.
Text-I/O¶
Text-I/O über einen Binärspeicher (wie eine Datei) ist deutlich langsamer als binäre I/O über denselben Speicher, da er Konvertierungen zwischen Unicode und Binärdaten mithilfe eines Zeichencodecs erfordert. Dies kann beim Umgang mit riesigen Textdatenmengen wie großen Log-Dateien spürbar werden. Auch tell() und seek() sind aufgrund des verwendeten Rekonstruktionsalgorithmus recht langsam.
StringIO hingegen ist ein natives In-Memory-Unicode-Container und zeigt eine ähnliche Geschwindigkeit wie BytesIO.
Multithreading¶
FileIO-Objekte sind bis zu dem Grad threadsicher, wie die von ihnen umschlossenen Betriebssystemaufrufe (wie read(2) unter Unix) threadsicher sind.
Binäre gepufferte Objekte (Instanzen von BufferedReader, BufferedWriter, BufferedRandom und BufferedRWPair) schützen ihre internen Strukturen mit einem Sperrmechanismus; daher ist es sicher, sie gleichzeitig aus mehreren Threads aufzurufen.
TextIOWrapper-Objekte sind nicht threadsicher.
Re-entrancy¶
Binäre gepufferte Objekte (Instanzen von BufferedReader, BufferedWriter, BufferedRandom und BufferedRWPair) sind nicht reentrant. Obwohl reentrant Aufrufe in normalen Situationen nicht vorkommen, können sie durch I/O in einem signal-Handler entstehen. Wenn ein Thread versucht, ein gepuffertes Objekt erneut aufzurufen, auf das er bereits zugreift, wird ein RuntimeError ausgelöst. Beachten Sie, dass dies einen anderen Thread nicht daran hindert, das gepufferte Objekt aufzurufen.
Dies erweitert sich implizit auf Textdateien, da die Funktion open() ein gepuffertes Objekt in einen TextIOWrapper einschließen wird. Dies schließt Standard-Streams ein und beeinflusst daher auch die eingebaute Funktion print().