HOWTO · Python

Wie man eine Datei Zeile für Zeile in eine Liste in Python einliest

Dieses Tutorial führt ein, wie man eine Datei Zeile für Zeile in eine Liste in Python einliest

Auf dieser Seite

Um eine Textdatei in eine Liste umzuwandeln, wählen Sie die Methode danach aus, ob Sie Zeilenumbrüche beibehalten müssen und wie viel Daten in den Arbeitsspeicher passt. Öffnen Sie Textdateien mit einer expliziten Zeichenkodierung, damit Python ihre Bytes einheitlich dekodiert. Die folgenden Beispiele erstellen jeweils selbst eine kleine Datei und lassen sich daher ohne einen bestimmten Dateipfad anpassen. Die Beispielzeilen und Ausgaben enthalten englische Bezeichnungen; sie bleiben in den unveränderten Beispielen auf Englisch.

Verwenden Sie readlines(), um eine Liste mit Zeilen zu erstellen

Die Methode readlines() liest den verbleibenden Datenstrom und gibt eine Liste mit einer Zeichenkette pro Zeile zurück. Im Textmodus bleiben die Zeilenumbruchzeichen normalerweise in diesen Zeichenketten erhalten. Pythons standardmäßige Behandlung universeller Zeilenumbrüche wandelt gängige Zeilenenden der Eingabe in \n um; bei einer letzten Zeile ohne Zeilenumbruch bleibt dieser ebenfalls aus. Die Liste enthält daher den Text sowie die Zeilenumbrüche, sofern sie vorhanden waren.

Führen Sie das eigenständige Beispiel aus, um eine Liste zu erstellen, in der die von readlines() zurückgegebenen Zeilenumbruchzeichen erhalten bleiben:

Der Code und die angezeigten Bezeichnungen oder Ausgaben in diesem Abschnitt bleiben auf Englisch.

from pathlib import Path
from tempfile import TemporaryDirectory

with TemporaryDirectory() as directory:
    path = Path(directory) / "notes.txt"
    path.write_text("Line One: 1\nLine Two: 2\nLine Three: 3\n", encoding="utf-8")
    with path.open("r", encoding="utf-8") as file:
        lines = file.readlines()
    print(lines)

Wenn Sie den Text ohne den Zeilenvorschub möchten, verwenden Sie für jede Zeichenkette rstrip("\n"). Dadurch werden Zeilenvorschubzeichen am Ende entfernt, während Leerzeichen und Tabulatoren erhalten bleiben, die zum Inhalt gehören können. Entfernen Sie nicht pauschal alle Leerraumzeichen, es sei denn, das gehört zu Ihrer Datenbereinigungsregel.

Iterieren Sie über die Datei, um nicht alle Zeilen auf einmal zu laden

Ein Textdateiobjekt lässt sich direkt durchlaufen. Dabei wird jeweils eine Zeile gelesen. So wird nicht zuerst zusätzlich eine Liste mit allen Zeilen erstellt, wie sie readlines() zurückgibt. Wenn Sie jedoch jede Zeile an eine Ergebnisliste anhängen, enthält diese Liste weiterhin den gesamten Dateitext und benötigt entsprechend ihrer Größe Arbeitsspeicher.

Das folgende Beispiel erstellt die gewünschte Liste und entfernt dabei nur den abschließenden Zeilenvorschub jeder Zeile:

Der Code und die angezeigten Bezeichnungen oder Ausgaben in diesem Abschnitt bleiben auf Englisch.

from pathlib import Path
from tempfile import TemporaryDirectory

with TemporaryDirectory() as directory:
    path = Path(directory) / "notes.txt"
    path.write_text("Line One: 1\nLine Two: 2\nLine Three: 3\n", encoding="utf-8")
    with path.open("r", encoding="utf-8") as file:
        lines = [line.rstrip("\n") for line in file]
    print(lines)

Ist eine Datei zu groß, um sie als Liste im Arbeitsspeicher zu behalten, verarbeiten Sie jede Zeile innerhalb des with-Blocks, statt sie anzuhängen. Sie können zum Beispiel eine Bedingung prüfen, einen laufenden Zähler aktualisieren oder umgewandelte Daten in eine andere Datei schreiben. So müssen nicht alle Eingabezeilen gleichzeitig gespeichert werden; andere Datenstrukturen, die der Vorgang verwendet, benötigen jedoch weiterhin Arbeitsspeicher.

Verwenden Sie read().splitlines(), wenn die ganze Datei in den Arbeitsspeicher passt

Ein Aufruf von read() ohne Größenangabe liest ab der aktuellen Position bis zum Dateiende (EOF) und gibt eine einzelne Zeichenkette zurück. Mit splitlines() auf dieser Zeichenkette erstellen Sie eine Liste ihrer Zeilen. Standardmäßig entfernt splitlines() die Zeilengrenzen; übergeben Sie keepends=True, um sie beizubehalten. Da die vollständige Zeichenkette bereits vor dem Erstellen der Liste vorliegt, können bei diesem Verfahren vorübergehend sowohl der Dateitext als auch die Liste der einzelnen Teile im Arbeitsspeicher liegen.

Der Code und die angezeigten Bezeichnungen oder Ausgaben in diesem Abschnitt bleiben auf Englisch.

from pathlib import Path
from tempfile import TemporaryDirectory

with TemporaryDirectory() as directory:
    path = Path(directory) / "notes.txt"
    path.write_text("Line One: 1\nLine Two: 2\nLine Three: 3\n", encoding="utf-8")
    with path.open("r", encoding="utf-8") as file:
        lines_without_endings = file.read().splitlines()
    with path.open("r", encoding="utf-8") as file:
        lines_with_endings = file.read().splitlines(keepends=True)
    print(lines_without_endings)
    print(lines_with_endings)

Wählen Sie eine Methode nach Speicherbedarf und Anforderungen an Zeilenumbrüche

Verwenden Sie readlines(), wenn Sie eine Liste möchten und es hilfreich ist, die Zeilenumbrüche beizubehalten. Durchlaufen Sie die Datei, wenn Sie die Eingabe schrittweise verarbeiten möchten oder eine Liste benötigen, aber eine zusätzliche Zwischenliste vermeiden wollen. Wählen Sie read().splitlines(), wenn die ganze Datei problemlos in den Arbeitsspeicher passt und Sie Zeichenketten ohne Zeilenumbrüche kompakt erstellen möchten; setzen Sie keepends=True, wenn die Zeilenumbrüche wichtig sind.

Eine vollständige Liste ist nie kostenlos zu speichern: Sowohl die Zeichenketten als auch die Listenstruktur benötigen Arbeitsspeicher. Ist die Datei so groß, dass das Erstellen der gewünschten Liste einen MemoryError verursachen könnte, verarbeiten Sie jede Zeile direkt beim Einlesen, statt alle Zeilen anzusammeln. Die Methoden unterscheiden sich hinsichtlich Speicherbedarf und Zeilenumbruchverhalten. Wählen Sie daher nach dem benötigten Ergebnis und gehen Sie nicht davon aus, dass eine Methode immer schneller ist.