HOWTO · Python
Python Zeichenkette in Datei suchen
Das Tutorial demonstriert, wie man in Python nach einer Zeichenkette in einer Textdatei sucht.
Auf dieser Seite
Um in einer Textdatei nach einer wörtlichen Teilzeichenfolge zu suchen, verwenden Sie read() mit in, wenn ein boolesches Ergebnis genügt, readlines(), wenn Sie die passenden Zeilen prüfen möchten, oder find(), wenn Sie die Zeichenposition benötigen. Für große Dateien oder byteorientierte Daten bietet mmap eine dateigestützte Suche. Die Beispiele verwenden denselben kurzen Text, damit Sie Ergebnisse und Einschränkungen vergleichen können. Jedes Beispiel ist ausführbar; die gezeigten Ausgaben entsprechen der bereitgestellten Ausführung. Die unveränderten Code- und Ausgabeblöcke enthalten Python-Werte wie True; die Beispielzeile „owner=Sam“ bleibt englisch.
Dateiinhalt mit read() und in durchsuchen
Die Methode read() gibt den verbleibenden Dateiinhalt als einzelne Zeichenkette zurück. Mit Pythons in-Operator prüfen Sie, ob diese Zeichenkette den gesuchten wörtlichen Text enthält. Der Ausdruck ergibt True oder False und eignet sich, wenn Sie nur wissen müssen, ob die Teilzeichenfolge vorkommt.
Dieser Ansatz ist direkt, liest aber vor der Suche die gesamte Datei in den Arbeitsspeicher ein. Er eignet sich für kleine oder mittelgroße Textdateien sowie für Fälle, in denen Sie den vollständigen Inhalt ohnehin benötigen. Ist die Datei zu groß, um bequem im Arbeitsspeicher Platz zu finden, verwenden Sie stattdessen eine zeilenweise oder speicherabgebildete Vorgehensweise.
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("status=ready\nowner=Sam\n", encoding="utf-8")
with path.open(encoding="utf-8") as file:
found = "ready" in file.read()
print(found)
True
Zeile für Zeile mit readlines() suchen
Die Methode readlines() gibt eine Liste mit den Zeilen der Datei zurück; vorhandene Zeilenumbruchzeichen bleiben dabei erhalten. Sie können jede Zeile mit in prüfen und beim ersten Treffer abbrechen. Das ist nützlich, wenn die passende Zeile selbst wichtig ist, etwa weil Sie den zugehörigen Datensatz anzeigen oder verarbeiten möchten. Die Beispielzeile „owner=Sam“ bleibt im unveränderten Code und in der Ausgabe englisch.
Auch wenn die Schleife früh abbrechen kann, hat readlines() zuvor bereits alle Zeilen in eine Liste geladen. Der Speicherbedarf wächst daher mit der Dateigröße. Bei einer großen Datei, die schrittweise verarbeitet werden soll, durchlaufen Sie stattdessen die geöffnete Datei direkt mit for line in file. So wird keine vollständige Liste aufgebaut, während die zeilenweise Suchlogik erhalten bleibt.
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("status=ready\nowner=Sam\n", encoding="utf-8")
with path.open(encoding="utf-8") as file:
for line in file.readlines():
if "owner" in line:
print(line.rstrip())
break
owner=Sam
Mit find() die Trefferposition ermitteln
Verwenden Sie die Methode find() auf dem von read() zurückgegebenen Inhalt, wenn Sie statt einer Ja-Nein-Antwort den Anfangsindex des Treffers benötigen. Der Index beginnt bei null: Ein Treffer ganz am Anfang ergibt 0, ein späterer Treffer die entsprechende Position in der Zeichenkette. Gibt es keinen Treffer, liefert find() den Wert -1. Prüfen Sie ausdrücklich auf diesen Wert, statt jedes Ergebnis als boolesch zu behandeln, denn 0 gilt in Python als falsch.
Die zurückgegebene Position zählt Zeichen in der dekodierten Python-Zeichenkette und keine Bytes in der Datei. Öffnen Sie Textdateien mit einer geeigneten Kodierung, wenn sie Nicht-ASCII-Zeichen enthalten. Wenn Sie Byte-Offsets benötigen oder der Inhalt binär ist, verwenden Sie eine byteorientierte Suche, etwa mmap mit einem Bytes-Muster.
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("status=ready\nowner=Sam\n", encoding="utf-8")
with path.open(encoding="utf-8") as file:
contents = file.read()
position = contents.find("ready")
print(position)
print(contents.find("missing"))
7
-1
Große Dateien mit mmap durchsuchen
Das Modul mmap bildet eine Datei auf ein bytesähnliches Objekt ab. Dieses lässt sich durchsuchen, ohne zuvor eine Python-Zeichenkette mit dem gesamten Dateiinhalt anzulegen. Das kann bei großen Dateien hilfreich sein, garantiert aber keine schnellere Suche: Die Leistung hängt von der Datei, dem Speichergerät, dem Betriebssystem und dem Zugriffsmuster ab. Eine Speicherabbildung belegt außerdem Betriebssystemressourcen und sollte nach der Verwendung geschlossen werden.
Durchsuchen Sie die Abbildung mit einem Bytes-Muster wie b"ready". Anders als bei den Textbeispielen wird dabei nach kodierten Bytes gesucht und ein Byte-Offset zurückgegeben. Das Muster muss vom Typ Bytes sein; eine normale Zeichenkette wie "ready" ist ein anderer Typ. Dieses Beispiel verwendet UTF-8-Bytes für denselben ASCII-Text und öffnet die Datei im Binärmodus.
Führen Sie dieses Beispiel aus:
Der Code und die angezeigten Bezeichnungen oder Ausgaben in diesem Abschnitt bleiben auf Englisch.
import mmap
from pathlib import Path
from tempfile import TemporaryDirectory
with TemporaryDirectory() as directory:
path = Path(directory) / "notes.txt"
path.write_bytes(b"status=ready\nowner=Sam\n")
with path.open("rb") as file:
with mmap.mmap(file.fileno(), 0, access=mmap.ACCESS_READ) as mapped:
print(mapped.find(b"ready"))
7
Die passende Vorgehensweise wählen
Verwenden Sie read() mit in, wenn eine boolesche Antwort ausreicht und der gesamte Text problemlos in den Arbeitsspeicher passt. Verwenden Sie readlines(), wenn Sie eine Liste von Zeilen benötigen, die Sie prüfen oder weiterverwenden möchten; bedenken Sie dabei, dass die Liste die gesamte Datei enthält. Bei großen Textdateien, deren Zeilen unabhängig voneinander verarbeitet werden können, durchlaufen Sie das Dateiobjekt direkt, statt alle Zeilen zu speichern.
Verwenden Sie find(), wenn die Zeichenposition des ersten wörtlichen Treffers wichtig ist. Prüfen Sie auf -1, wenn Sie feststellen möchten, dass der Text fehlt, und behandeln Sie 0 als gültige Position. Verwenden Sie mmap, wenn eine dateigestützte Suche in Bytes sinnvoll ist und Sie einen Byte-Offset benötigen. Kodieren Sie das Suchziel als Bytes und gehen Sie nicht davon aus, dass eine Speicherabbildung immer schneller ist. Diese Methoden suchen nach wörtlichem Text. Wenn Sie stattdessen Muster, eine Vereinheitlichung der Groß- und Kleinschreibung oder alle Vorkommen benötigen, wählen Sie eine dafür vorgesehene Methode.