fileinput — Zeilen aus mehreren Eingabeströmen iterieren

Quellcode: Lib/fileinput.py


Dieses Modul implementiert eine Hilfsklasse und Funktionen, um schnell eine Schleife über die Standardeingabe oder eine Liste von Dateien zu schreiben. Wenn Sie nur eine Datei lesen oder schreiben möchten, siehe open().

Die typische Verwendung ist

import fileinput
for line in fileinput.input(encoding="utf-8"):
    process(line)

Dies iteriert über die Zeilen aller Dateien, die in sys.argv[1:] aufgeführt sind, wobei standardmäßig sys.stdin verwendet wird, wenn die Liste leer ist. Wenn ein Dateiname '-' ist, wird er ebenfalls durch sys.stdin ersetzt und die optionalen Argumente mode und openhook werden ignoriert. Um eine alternative Liste von Dateinamen anzugeben, übergeben Sie diese als erstes Argument an input(). Ein einzelner Dateiname ist ebenfalls zulässig.

Alle Dateien werden standardmäßig im Textmodus geöffnet, aber Sie können dies überschreiben, indem Sie den Parameter mode im Aufruf von input() oder FileInput angeben. Wenn während des Öffnens oder Lesens einer Datei ein E/A-Fehler auftritt, wird OSError ausgelöst.

Geändert in Version 3.3: IOError wurde früher ausgelöst; es ist jetzt ein Alias für OSError.

Wenn sys.stdin mehr als einmal verwendet wird, gibt die zweite und weitere Verwendung keine Zeilen zurück, außer vielleicht für die interaktive Verwendung oder wenn sie explizit zurückgesetzt wurde (z.B. mit sys.stdin.seek(0)).

Leere Dateien werden geöffnet und sofort geschlossen; die einzige Zeit, in der ihre Anwesenheit in der Liste der Dateinamen überhaupt auffällt, ist, wenn die zuletzt geöffnete Datei leer ist.

Zeilen werden mit ihren Zeilenumbrüchen zurückgegeben, was bedeutet, dass die letzte Zeile in einer Datei möglicherweise keinen hat.

Sie können steuern, wie Dateien geöffnet werden, indem Sie einen Öffnungshaken über den Parameter openhook an fileinput.input() oder FileInput() übergeben. Der Haken muss eine Funktion sein, die zwei Argumente, filename und mode, annimmt und ein entsprechend geöffnetes dateiähnliches Objekt zurückgibt. Wenn encoding und/oder errors angegeben sind, werden sie als zusätzliche Schlüsselwortargumente an den Haken übergeben. Dieses Modul bietet einen hook_compressed() zur Unterstützung komprimierter Dateien.

Die folgende Funktion ist die primäre Schnittstelle dieses Moduls

fileinput.input(files=None, inplace=False, backup='', *, mode='r', openhook=None, encoding=None, errors=None)

Erzeugt eine Instanz der Klasse FileInput. Die Instanz wird als globaler Zustand für die Funktionen dieses Moduls verwendet und auch zur Iteration zurückgegeben. Die Parameter dieser Funktion werden an den Konstruktor der Klasse FileInput weitergegeben.

Die Instanz FileInput kann als Kontextmanager in der with-Anweisung verwendet werden. In diesem Beispiel wird input geschlossen, nachdem die with-Anweisung verlassen wurde, auch wenn eine Ausnahme auftritt

with fileinput.input(files=('spam.txt', 'eggs.txt'), encoding="utf-8") as f:
    for line in f:
        process(line)

Geändert in Version 3.2: Kann als Kontextmanager verwendet werden.

Geändert in Version 3.8: Die Schlüsselwortparameter mode und openhook sind jetzt nur noch als Schlüsselwortparameter zulässig.

Geändert in Version 3.10: Die nur als Schlüsselwortparameter zulässigen Parameter encoding und errors wurden hinzugefügt.

Die folgenden Funktionen verwenden den globalen Zustand, der von fileinput.input() erstellt wurde; wenn kein aktiver Zustand vorhanden ist, wird RuntimeError ausgelöst.

fileinput.filename()

Gibt den Namen der gerade gelesenen Datei zurück. Bevor die erste Zeile gelesen wurde, wird None zurückgegeben.

fileinput.fileno()

Gibt den ganzzahligen „Dateideskriptor“ für die aktuelle Datei zurück. Wenn keine Datei geöffnet ist (vor der ersten Zeile und zwischen Dateien) wird -1 zurückgegeben.

fileinput.lineno()

Gibt die kumulative Zeilennummer der gerade gelesenen Zeile zurück. Bevor die erste Zeile gelesen wurde, wird 0 zurückgegeben. Nachdem die letzte Zeile der letzten Datei gelesen wurde, gibt die Funktion die Zeilennummer dieser Zeile zurück.

fileinput.filelineno()

Gibt die Zeilennummer in der aktuellen Datei zurück. Bevor die erste Zeile gelesen wurde, wird 0 zurückgegeben. Nachdem die letzte Zeile der letzten Datei gelesen wurde, gibt die Funktion die Zeilennummer dieser Zeile innerhalb der Datei zurück.

fileinput.isfirstline()

Gibt True zurück, wenn die gerade gelesene Zeile die erste Zeile ihrer Datei ist, andernfalls gibt sie False zurück.

fileinput.isstdin()

Gibt True zurück, wenn die letzte Zeile aus sys.stdin gelesen wurde, andernfalls gibt sie False zurück.

fileinput.nextfile()

Schließt die aktuelle Datei, sodass die nächste Iteration die erste Zeile aus der nächsten Datei (falls vorhanden) liest; nicht gelesene Zeilen werden nicht zur kumulativen Zeilenzahl gezählt. Der Dateiname wird erst geändert, nachdem die erste Zeile der nächsten Datei gelesen wurde. Bevor die erste Zeile gelesen wurde, hat diese Funktion keine Auswirkung; sie kann nicht verwendet werden, um die erste Datei zu überspringen. Nachdem die letzte Zeile der letzten Datei gelesen wurde, hat diese Funktion keine Auswirkung.

fileinput.close()

Schließt die Sequenz.

Die Klasse, die das vom Modul bereitgestellte Sequenzverhalten implementiert, ist ebenfalls zur Unterklassifizierung verfügbar

class fileinput.FileInput(files=None, inplace=False, backup='', *, mode='r', openhook=None, encoding=None, errors=None)

Die Klasse FileInput ist die Implementierung; ihre Methoden filename(), fileno(), lineno(), filelineno(), isfirstline(), isstdin(), nextfile() und close() entsprechen den gleichnamigen Funktionen im Modul. Zusätzlich ist sie iterable und hat eine readline()-Methode, die die nächste Eingabezeile zurückgibt. Die Sequenz muss streng sequenziell durchlaufen werden; zufälliger Zugriff und readline() können nicht gemischt werden.

Mit mode können Sie angeben, welcher Dateimodus an open() übergeben wird. Er muss einer von 'r' und 'rb' sein.

Der openhook muss, wenn er angegeben wird, eine Funktion sein, die zwei Argumente, filename und mode, annimmt und ein entsprechend geöffnetes dateiähnliches Objekt zurückgibt. Sie können inplace und openhook nicht zusammen verwenden.

Sie können encoding und errors angeben, die an open() oder openhook übergeben werden.

Eine Instanz von FileInput kann als Kontextmanager in der with-Anweisung verwendet werden. In diesem Beispiel wird input geschlossen, nachdem die with-Anweisung verlassen wurde, auch wenn eine Ausnahme auftritt

with FileInput(files=('spam.txt', 'eggs.txt')) as input:
    process(input)

Geändert in Version 3.2: Kann als Kontextmanager verwendet werden.

Geändert in Version 3.8: Die Schlüsselwortparameter mode und openhook sind jetzt nur noch als Schlüsselwortparameter zulässig.

Geändert in Version 3.10: Die nur als Schlüsselwortparameter zulässigen Parameter encoding und errors wurden hinzugefügt.

Geändert in Version 3.11: Die Modi 'rU' und 'U' sowie die Methode __getitem__() wurden entfernt.

Optionale In-Place-Filterung: Wenn das Schlüsselwortargument inplace=True an fileinput.input() oder den Konstruktor FileInput übergeben wird, wird die Datei in eine Sicherungsdatei verschoben und die Standardausgabe wird in die Eingabedatei umgeleitet (wenn eine Datei mit demselben Namen wie die Sicherungsdatei bereits existiert, wird sie stillschweigend ersetzt). Dies ermöglicht das Schreiben eines Filters, der seine Eingabedatei an Ort und Stelle umschreibt. Wenn der Parameter backup angegeben wird (typischerweise als backup='.<some extension>'), gibt er die Erweiterung für die Sicherungsdatei an, und die Sicherungsdatei bleibt erhalten; standardmäßig ist die Erweiterung '.bak' und sie wird gelöscht, wenn die Ausgabedatei geschlossen wird. Die In-Place-Filterung ist deaktiviert, wenn die Standardeingabe gelesen wird.

Die folgenden beiden Öffnungshaken werden von diesem Modul bereitgestellt

fileinput.hook_compressed(filename, mode, *, encoding=None, errors=None)

Öffnet transparent Dateien, die mit gzip und bzip2 komprimiert sind (erkennbar an den Erweiterungen '.gz' und '.bz2'), mithilfe der Module gzip und bz2. Wenn die Dateierweiterung nicht '.gz' oder '.bz2' ist, wird die Datei normal geöffnet (d.h. mit open() ohne Dekomprimierung).

Die Werte encoding und errors werden für komprimierte Dateien an io.TextIOWrapper übergeben und für normale Dateien geöffnet.

Verwendungsbeispiel: fi = fileinput.FileInput(openhook=fileinput.hook_compressed, encoding="utf-8")

Geändert in Version 3.10: Die nur als Schlüsselwortparameter zulässigen Parameter encoding und errors wurden hinzugefügt.

fileinput.hook_encoded(encoding, errors=None)

Gibt einen Haken zurück, der jede Datei mit open() öffnet und die angegebenen encoding und errors verwendet, um die Datei zu lesen.

Verwendungsbeispiel: fi = fileinput.FileInput(openhook=fileinput.hook_encoded("utf-8", "surrogateescape"))

Geändert in Version 3.6: Der optionale Parameter errors wurde hinzugefügt.

Veraltet seit Version 3.10: Diese Funktion ist veraltet, da fileinput.input() und FileInput jetzt die Parameter encoding und errors haben.