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 von os.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 open mit 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 str und ein absoluter Pfad sein.

Das Verhalten dieser Funktion kann durch einen früheren Aufruf von PyFile_SetOpenCodeHook() überschrieben werden. Unter der Annahme, dass path ein str und ein absoluter Pfad ist, sollte open_code(path) jedoch immer dasselbe verhalten wie open(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() oder TextIOWrapper verwenden und einen Parameter encoding=None haben.

Diese Funktion gibt encoding zurück, wenn es nicht None ist. Andernfalls gibt sie "locale" oder "utf-8" zurück, abhängig vom UTF-8-Modus.

Diese Funktion löst eine EncodingWarning aus, wenn sys.flags.warn_default_encoding wahr ist und encoding None ist. stacklevel gibt an, wo die Warnung ausgelöst wird. Zum Beispiel

def 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 EncodingWarning für den Aufrufer von read_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 encoding None ist.

exception io.BlockingIOError

Dies ist ein Kompatibilitäts-Alias für die eingebaute Ausnahme BlockingIOError.

exception io.UnsupportedOperation

Eine Ausnahme, die von OSError und ValueError erbt und ausgelöst wird, wenn eine nicht unterstützte Operation auf einem Stream aufgerufen wird.

Siehe auch

sys

enthält die Standard-I/O-Streams: sys.stdin, sys.stdout und sys.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

IOBase

fileno, seek und truncate

close, closed, __enter__, __exit__, flush, isatty, __iter__, __next__, readable, readline, readlines, seekable, tell, writable und writelines

RawIOBase

IOBase

readinto und write

Geerbte Methoden von IOBase, read und readall

BufferedIOBase

IOBase

detach, read, read1 und write

Geerbte Methoden von IOBase, readinto und readinto1

TextIOBase

IOBase

detach, read, readline und write

Geerbte Methoden von IOBase, encoding, errors und newlines

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 IOBase read() oder write() nicht deklariert, da ihre Signaturen variieren werden, sollten Implementierungen und Clients diese Methoden als Teil der Schnittstelle betrachten. Außerdem können Implementierungen einen ValueError (oder UnsupportedOperation) 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 mit str-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 ValueError auslösen.

IOBase (und seine Unterklassen) unterstützt das Iterator-Protokoll, was bedeutet, dass ein IOBase-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. Siehe readline() unten.

IOBase ist auch ein Kontextmanager und unterstützt daher die with-Anweisung. In diesem Beispiel wird die Datei nach Abschluss des Suites der with-Anweisung geschlossen – auch wenn ein Fehler auftritt

with open('spam.txt', 'w') as file:
    file.write('Spam and eggs!')

IOBase stellt 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 ValueError aus.

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 OSError wird 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 True zurück, wenn der Stream interaktiv ist (d. h. mit einem Terminal/tty-Gerät verbunden).

readable()

Gibt True zurück, wenn der Stream gelesen werden kann. Wenn False, löst read() einen OSError aus.

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 von open() 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 0 oder kleiner sowie None werden als kein Hinweis behandelt.

Beachten Sie, dass es bereits möglich ist, über Datei-Objekte zu iterieren, indem man for line in file: ... verwendet, ohne file.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_SET oder 0 – Anfang des Streams (Standard); offset sollte null oder positiv sein

  • os.SEEK_CUR oder 1 – aktuelle Stream-Position; offset kann negativ sein

  • os.SEEK_END oder 2 – 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_HOLE oder os.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 True zurück, wenn der Stream zufälligen Zugriff unterstützt. Wenn False, lösen seek(), tell() und truncate() eine OSError aus.

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 True zurück, wenn der Stream Schreibzugriff unterstützt. Wenn False, lösen write() und truncate() eine OSError aus.

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.

__del__()

Vorbereitung auf die Objektzerstörung. IOBase bietet eine Standardimplementierung dieser Methode, die die close()-Methode der Instanz aufruft.

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).

RawIOBase stellt zusätzlich zu den Methoden von IOBase diese 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 None zurückgegeben.

Die Standardimplementierung leitet an readall() und readinto() 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 bytearray sein. Wenn das Objekt im nicht-blockierenden Modus ist und keine Bytes verfügbar sind, wird None zurü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. None wird 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 RawIOBase ist, dass die Methoden read(), readinto() und write() 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() eine BlockingIOError mit BlockingIOError.characters_written auslösen und read() bisher gelesene Daten oder None zurückgeben, wenn keine Daten verfügbar sind.

Außerdem hat die Methode read() keine Standardimplementierung, die an readinto() weiterleitet.

Eine typische Implementierung von BufferedIOBase sollte nicht von einer Implementierung von RawIOBase erben, sondern diese umschließen, wie es z. B. BufferedWriter und BufferedReader tun.

BufferedIOBase stellt zusätzlich zu den Datenattributen und Methoden von IOBase diese zur Verfügung

raw

Der zugrundeliegende rohe Stream (eine Instanz von RawIOBase), mit dem BufferedIOBase arbeitet. Dies ist kein Teil der BufferedIOBase API 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 eine UnsupportedOperation aus.

Hinzugefügt in Version 3.1.

read(size=-1, /)

Liest und gibt bis zu size Bytes zurück. Wenn das Argument weggelassen wird, None ist 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, siehe os.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 (was RawIOBase.readall() implementieren sollte), andernfalls wird in einer Schleife gelesen, bis read None, leere bytes oder 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 BlockingIOError auslösen oder None zurückgeben, wenn keine Daten verfügbar sind. io-Implementierungen geben None zurück.

read1(size=-1, /)

Liest und gibt bis zu size Bytes zurück, wobei readinto() aufgerufen wird, was bei EINTR gemäß PEP 475 wiederholt werden kann. Wenn size -1 ist 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 BlockingIOError auslösen oder None zurückgeben, wenn keine Daten verfügbar sind. io-Implementierungen geben None zurü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 bytearray sein.

Wie bei read() können mehrere Lesevorgänge auf dem zugrundeliegenden rohen Stream ausgeführt werden, es sei denn, letzterer ist interaktiv.

Eine BlockingIOError wird 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 (oder readinto()) des zugrundeliegenden rohen Streams verwendet wird. Gibt die Anzahl der gelesenen Bytes zurück.

Eine BlockingIOError wird 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 OSError ausgelö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 BlockingIOError ausgelö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 closefd True (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 auf False gesetzt.

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. FileExistsError wird 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() und write() 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.open als opener führt zu einer Funktionalität, die der Übergabe von None ä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.

FileIO stellt zusätzlich zu den Datenattributen von RawIOBase und IOBase diese 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 Methode close() aufgerufen wird.

Das optionale Argument initial_bytes ist ein byte-ähnliches Objekt, das die anfänglichen Daten enthält.

BytesIO stellt diese Methoden zusätzlich zu denen von BufferedIOBase und IOBase bereit 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.

getvalue()

Gibt die bytes zurück, die den gesamten Inhalt des Puffers enthalten.

read1(size=-1, /)

In BytesIO ist dies dasselbe wie read().

Geändert in Version 3.7: Das Argument size ist jetzt optional.

readinto1(b, /)

In BytesIO ist dies dasselbe wie readinto().

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 von BufferedIOBase.

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 BufferedReader für den gegebenen lesbaren raw Stream und die buffer_size. Wenn buffer_size weggelassen wird, wird DEFAULT_BUFFER_SIZE verwendet.

BufferedReader stellt diese Methoden zusätzlich zu denen von BufferedIOBase und IOBase bereit 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 BufferedReader ist dies dasselbe wie io.BufferedIOBase.read().

read1(size=-1, /)

In BufferedReader ist dies dasselbe wie io.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 von BufferedIOBase.

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ßlich

  • wenn der Puffer zu klein für alle ausstehenden Daten wird;

  • wenn flush() aufgerufen wird;

  • wenn ein seek() angefordert wird (für BufferedRandom-Objekte);

  • wenn das BufferedWriter-Objekt geschlossen oder zerstört wird.

Der Konstruktor erstellt einen BufferedWriter für den gegebenen schreibbaren raw Stream. Wenn die buffer_size nicht angegeben ist, ist sie standardmäßig DEFAULT_BUFFER_SIZE.

BufferedWriter stellt diese Methoden zusätzlich zu denen von BufferedIOBase und IOBase bereit oder überschreibt sie.

flush()

Erzwingt das Schreiben von Bytes aus dem Puffer in den Rohstream. Ein BlockingIOError sollte 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 BlockingIOError mit gesetztem Attribut BlockingIOError.characters_written ausgelö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 von BufferedReader und BufferedWriter.

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.

BufferedRandom ist zu allem fähig, was BufferedReader oder BufferedWriter tun können. Zusätzlich sind seek() und tell() 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 von BufferedIOBase.

reader und writer sind RawIOBase-Objekte, die jeweils lesbar und schreibbar sind. Wenn die buffer_size weggelassen wird, ist sie standardmäßig DEFAULT_BUFFER_SIZE.

BufferedRWPair implementiert alle Methoden von BufferedIOBase mit Ausnahme von detach(), was eine UnsupportedOperation auslöst.

Warnung

BufferedRWPair versucht nicht, Zugriffe auf seine zugrunde liegenden Rohstreams zu synchronisieren. Sie sollten nicht dasselbe Objekt als Leser und Schreiber übergeben; verwenden Sie stattdessen BufferedRandom.

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.

TextIOBase stellt diese Datenattribute und Methoden zusätzlich zu denen von IOBase bereit 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 BufferedIOBase oder RawIOBase), mit dem TextIOBase arbeitet. Dies ist kein Teil der API von TextIOBase und möglicherweise nicht in allen Implementierungen vorhanden.

detach()

Trenne den zugrunde liegenden binären Puffer vom TextIOBase und gib ihn zurück.

Nachdem der zugrunde liegende Puffer getrennt wurde, befindet sich der TextIOBase in 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 eine UnsupportedOperation aus.

Hinzugefügt in Version 3.1.

read(size=-1, /)

Liest und gibt höchstens size Zeichen aus dem Stream als einzelne str zurück. Wenn size negativ oder None ist, wird bis zum Ende der Datei gelesen.

readline(size=-1, /)

Liest bis zu einem Zeilenumbruch oder dem Ende der Datei und gibt eine einzelne str zurü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_SET oder 0: sucht vom Anfang des Streams aus (Standard); offset muss entweder eine Zahl sein, die von TextIOBase.tell() zurückgegeben wurde, oder Null. Jeder andere offset-Wert führt zu undefiniertem Verhalten.

  • SEEK_CUR oder 1: sucht zur aktuellen Position; offset muss Null sein, was eine No-Operation ist (alle anderen Werte werden nicht unterstützt).

  • SEEK_END oder 2: 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 von TextIOBase.

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 Typ ValueError auszulösen, wenn ein Kodierungsfehler auftritt (der Standardwert von None hat 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 bei codecs.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 None ist, 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 None ist, werden alle geschriebenen '\n'-Zeichen in den systemweiten Standard-Zeilentrenner os.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 True ist, wird flush() impliziert, wenn ein Schreibaufruf ein Zeilenumbruchszeichen oder ein Wagenrücklaufzeichen enthält.

Wenn write_through True ist, wird garantiert, dass Aufrufe von write() nicht gepuffert werden: Alle auf das TextIOWrapper-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 von locale.getpreferredencoding(). Ändere nicht temporär die Locale-Kodierung mit locale.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 BlockingIOError ausgelöst werden, wenn eine Leseoperation nicht sofort abgeschlossen werden kann.

TextIOWrapper stellt zusätzlich zu den Attributen und Methoden von TextIOBase und IOBase die 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 int zurü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 von tell() 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.

tell()

Gibt die Stream-Position als undurchsichtige Zahl zurück. Der Rückgabewert von tell() kann als Eingabe für seek() verwendet werden, um eine frühere Stream-Position wiederherzustellen.

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 Modus w+ ä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 Modus a+ zum Anhängen vorzubereiten, verwenden Sie f.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 newline None ist, Zeilenumbrüche auf allen Plattformen als \n geschrieben werden.

StringIO stellt diese Methode zusätzlich zu den Methoden von TextIOBase und IOBase bereit:

getvalue()

Gibt einen str mit dem gesamten Inhalt des Puffers zurück. Zeilenumbrüche werden wie durch read() 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. T ist normalerweise str oder bytes, 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. T ist normalerweise str oder bytes, 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().