HOWTO · Python
Einlesen einer Textdatei in eine Liste in Python
Dieses Tutorial demonstriert, wie man eine Textdatei in eine Python-Liste einlesen kann.
Auf dieser Seite
Um eine Textdatei in eine Python-Liste einzulesen, legen Sie zuerst fest, wofür jedes Listenelement stehen soll: für eine einzelne Zeile, ein durch Trennzeichen abgegrenztes Feld, einen Datensatz oder einen numerischen Wert. Bei gewöhnlichem Text liest readlines() die Datei und fügt für jede Zeile eine Zeichenkette zur Ergebnisliste hinzu; vorhandene Zeilenenden bleiben dabei erhalten. Im Gegensatz dazu hält read() den vollständigen Dateiinhalt als Zeichenkette im Speicher und splitlines() erstellt daraus anschließend eine Liste von Zeilen ohne Zeilenenden. Wenn Sie eine große Datei nur verarbeiten möchten, durchlaufen Sie sie, statt alle Zeilen zu sammeln.
Die folgenden Beispiele erstellen jeweils eine kleine Eingabedatei. Sie können sie anpassen, indem Sie den temporären Pfad durch den Pfad zu Ihrer Datei ersetzen. Es handelt sich um Beispiele zur Veranschaulichung; sie wurden in dieser Schreibphase nicht ausgeführt.
Zeilen mit readlines() einlesen
readlines() gibt eine Liste zurück, deren Elemente den Zeilen der Datei entsprechen. Wenn ein Zeilenende vorhanden ist, bleibt es normalerweise in der jeweiligen Zeichenkette enthalten und kann bei der Anzeige der Liste als \n erscheinen. Der Kontextmanager schließt die Datei, nachdem die Liste eingelesen wurde.
Führen Sie dieses Beispiel aus:
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("First line\nSecond line\nThird line\n", encoding="utf-8")
with path.open(encoding="utf-8") as file:
lines = file.readlines()
print(lines)
Die Ergebnisliste enthält alle Zeilen einschließlich ihrer Zeilenenden im Arbeitsspeicher. Das ist praktisch bei kleinen Dateien, wenn Sie die ursprünglichen Zeilenzeichenketten behalten möchten. Wenn Sie eine große Datei nur verarbeiten müssen, verwenden Sie die Schleife im Abschnitt zur Verarbeitung großer Dateien, statt jede Zeile zu speichern.
Zeilen mit einer List Comprehension einlesen und bereinigen
Beim Durchlaufen einer Textdatei wird jeweils eine Zeile eingelesen. Eine List Comprehension kann daraus eine Liste erstellen; rstrip("\r\n") entfernt dabei Zeilenendzeichen, ohne Leerzeichen zu entfernen, die zum Text gehören.
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) / "names.txt"
path.write_text(" Ada \nLin\n", encoding="utf-8")
with path.open(encoding="utf-8") as file:
names = [line.rstrip("\r\n") for line in file]
print(names)
Eine weitere Möglichkeit ist strip(). Diese Methode entfernt jedoch Leerraum an beiden Enden, einschließlich bedeutungsvoller Leerzeichen in einer Zeile. Obwohl die Comprehension die Eingabe schrittweise liest, enthält die fertige Liste weiterhin alle bereinigten Zeichenketten im Arbeitsspeicher. Verwenden Sie diesen Ansatz, wenn Sie eine Liste benötigen und die Datei in den verfügbaren Speicher passt.
Die gesamte Datei einlesen und in Zeilen aufteilen
Verwenden Sie read() gefolgt von splitlines(), wenn der vollständige Text eingelesen werden soll, bevor er in Zeilen aufgeteilt wird. splitlines() erkennt gängige Zeilenumbrüche und übernimmt diese Trennzeichen nicht in die zurückgegebenen Zeichenketten.
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) / "poem.txt"
path.write_text("Red\nBlue\nGold\n", encoding="utf-8")
with path.open(encoding="utf-8") as file:
content = file.read()
lines = content.splitlines()
print(lines)
Sowohl die vollständige Zeichenkette als auch die daraus entstehende Liste belegen Speicher. Daher eignet sich dieser Ansatz kaum für sehr große Eingaben. Bei zeilenweiser Verarbeitung vermeiden eine Comprehension oder eine Schleife, dass zunächst eine zweite vollständige Kopie der Datei als einzelne Zeichenkette erstellt wird.
Große Dateien zeilenweise verarbeiten
Wenn sich jeder Datensatz unabhängig verarbeiten lässt, erledigen Sie die Arbeit innerhalb der Dateischleife und behalten nur den Zustand, den die Aufgabe erfordert. Dieses Beispiel zählt nicht leere Zeilen, ohne den Dateiinhalt als Liste zu speichern.
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) / "events.txt"
path.write_text("login\nview\nlogout\n", encoding="utf-8")
count = 0
with path.open(encoding="utf-8") as file:
for line in file:
if line.strip():
count += 1
print(count)
So beschränkt sich der Speicherbedarf auf die aktuelle Zeile und den kleinen Zähler. Wenn Sie ausdrücklich eine Liste benötigen, hängen Sie die verarbeiteten Zeichenketten in der Schleife an. Bedenken Sie dabei, dass die Liste mit der Datei wächst: Allein die Schleife macht eine gesammelte Liste nicht speichereffizient. Beim Öffnen eines nicht vorhandenen Pfads wird FileNotFoundError ausgelöst. Geben Sie einen gültigen Pfad an oder behandeln Sie den Fehler dort, wo die Anwendung darauf reagieren kann.
Durch Trennzeichen getrennten Text mit split() aufteilen
Bei einem einfachen Format mit einem bekannten Trennzeichen lesen Sie den Text ein und rufen split() mit diesem Trennzeichen auf. Das Ergebnis ist eine Liste aus Zeichenketten, keine Liste aus Zahlen; das Trennzeichen wird entfernt. Dieser Ansatz eignet sich für vorhersehbare Formate wie durch Doppelpunkte getrennte Werte. CSV-Anführungsregeln oder Trennzeichen innerhalb von Anführungszeichen werden damit jedoch nicht verarbeitet.
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) / "colors.txt"
path.write_text("red|green|blue", encoding="utf-8")
with path.open(encoding="utf-8") as file:
colors = file.read().split("|")
print(colors)
Leerraum bleibt erhalten, sofern Sie die einzelnen Felder nicht ausdrücklich bereinigen. Verwenden Sie beispielsweise eine List Comprehension mit field.strip(), wenn umgebende Leerzeichen zur Formatierung und nicht zu den Daten gehören.
Durch Trennzeichen getrennte Datensätze mit csv.reader() einlesen
Für CSV-Dateien und ähnliche durch Trennzeichen gegliederte Daten verwenden Sie das Python-Modul csv. Es verarbeitet Trennzeichen innerhalb von Anführungszeichen und maskierte Anführungszeichen gemäß dem Format. csv.reader() liefert pro Datensatz eine Liste aus Zeichenketten. Wandeln Sie den Iterator nur dann in eine Liste um, wenn alle Datensätze im Arbeitsspeicher gehalten werden sollen; für große Dateien können Sie auch direkt über den Iterator laufen.
Der Code und die angezeigten Bezeichnungen oder Ausgaben in diesem Abschnitt bleiben auf Englisch.
import csv
from pathlib import Path
from tempfile import TemporaryDirectory
with TemporaryDirectory() as directory:
path = Path(directory) / "people.csv"
path.write_text('name,city\n"Doe, Jane",Paris\nAlex,Rome\n', encoding="utf-8")
with path.open(newline="", encoding="utf-8") as file:
rows = list(csv.reader(file))
print(rows)
Jeder Datensatz bleibt eine eigene Zeile, auch eine Kopfzeile, falls die Eingabe eine enthält. Wenn Sie nur die Datensätze ohne Kopfzeile benötigen, überspringen oder verarbeiten Sie diese ausdrücklich. Der Zugriff auf die erste Zeile per Index liest keine Datei mit mehreren Datensätzen vollständig ein. Öffnen Sie eine CSV-Textdatei mit newline="", wie es das CSV-Modul empfiehlt.
Numerische Daten mit NumPy laden
Bei rechteckigen Textdaten mit Zahlen kann NumPys loadtxt() die Werte in ein Array einlesen. NumPy ist eine zusätzliche Abhängigkeit. Das Ergebnis ist ein Array und keine Python-Liste; rufen Sie tolist() auf, wenn Sie gewöhnliche verschachtelte Listen benötigen. Dieses Beispiel setzt eine Datei mit einheitlichen Trennzeichen und ohne Kopfzeile voraus.
Der Code und die angezeigten Bezeichnungen oder Ausgaben in diesem Abschnitt bleiben auf Englisch.
from pathlib import Path
from tempfile import TemporaryDirectory
try:
import numpy as np
except ImportError:
print("Install NumPy to run this example.")
else:
with TemporaryDirectory() as directory:
path = Path(directory) / "measurements.csv"
path.write_text("1.5,2.0\n3.5,4.0\n", encoding="utf-8")
values = np.loadtxt(path, delimiter=",")
print(values.tolist())
Verwenden Sie stattdessen csv.reader(), wenn die Zeilen unterschiedlich lang sein können, Text enthalten oder CSV-Anführungsregeln erfordern. NumPy eignet sich für numerische Daten, wenn Array-Operationen hilfreich sind; sein Parser und seine Array-Darstellung unterscheiden sich von einer Liste mit Zeilenzeichenketten.