File I/O und Regex
File I/O und Regex
Viele Skripte lesen Dateien, verarbeiten Inhalte und schreiben Ergebnisse wieder weg.
Dazu kommen häufig reguläre Ausdrücke, um Muster in Texten zu finden.
Dateien öffnen
open öffnet eine Datei und liefert ein Handle-Objekt.
Wichtige Modi:
| Modus | Bedeutung |
|---|---|
r | Text lesen |
w | Text schreiben, überschreibt Datei |
a | Text anhängen |
rb | Binär lesen |
wb | Binär schreiben |
with verwenden
with open(file_path, "r", encoding="utf-8") as fd:
for line in fd:
print(line)
with sorgt dafür, dass die Datei nach dem Block sauber geschlossen wird.
Das ist robuster als manuelles Öffnen und Schließen.
Text lesen
with open(file_path, "r", encoding="utf-8") as fd:
text = fd.read()
Zeilenweise:
with open(file_path, "r", encoding="utf-8") as fd:
for line in fd:
print(line)
Binärdaten lesen
with open(file_path, "rb") as fd:
bin_data = fd.read(64)
Binärmodus ist wichtig, wenn Daten nicht als Text interpretiert werden sollen.
Schreiben und Anhängen
Überschreiben:
with open(file_path, "w", encoding="utf-8") as fd:
chars_written = fd.write("Hello World\n")
Anhängen:
with open(file_path, "a", encoding="utf-8") as fd:
chars_written = fd.write("Hello World die Zweite")
Pfade robust bauen
import os
script_dir = os.path.dirname(os.path.abspath(__file__))
file_path = os.path.join(script_dir, "data.txt")
So hängt der Pfad vom Speicherort des Skripts ab und nicht vom aktuellen Arbeitsverzeichnis.
Reguläre Ausdrücke
Regular Expressions beschreiben Suchmuster in Texten.
Einsatz:
- Text durchsuchen
- Werte extrahieren
- Validierung
- Search and Replace
- Loganalyse
Regex-Syntax
| Ausdruck | Bedeutung |
|---|---|
| `a | b` |
a+ | ein oder mehrere a |
a\\s | a gefolgt von Whitespace |
\\d{2,7} | zwei bis sieben Ziffern |
1337$ | endet mit 1337 |
^1337 | beginnt mit 1337 |
Sonderzeichen wie . ^ $ * + ? ( ) [ ] { } \\ | müssen escaped werden, wenn sie wörtlich gemeint sind.
Regex in Python
from re import compile
phone_number_regex = compile(r"\d\d\d\d/\d\d\d\d\d\d\d\d")
match = phone_number_regex.search(
"My phone number is: 0689/13371337."
)
print(match.group())
Raw Strings mit r"..." sind für Regex besonders angenehm.
Gruppen
phone_number_regex = compile(r"(\d\d\d\d)(/)(\d\d\d\d\d\d\d\d)")
match = phone_number_regex.search("My phone number is: 0689/13371337.")
print(match.group(0)) # vollständiger Match
print(match.group(1)) # Vorwahl
print(match.group(2)) # Trenner
print(match.group(3)) # Nummer
Klammern bilden Gruppen.
Greedy und Non-Greedy
Standardmäßig matcht Python greedy, also möglichst lang.
greedy_re = compile(r"(Yes){2,6}")
match = greedy_re.search("YesYesYesYesYesYesYes")
Non-greedy:
lazy_re = compile(r"(Yes){2,6}?")
match = lazy_re.search("YesYesYesYesYesYesYes")
Das ? nach dem Quantifier macht den Match möglichst kurz.
findall
Ohne Gruppen:
phone_number_regex = compile(r"\d\d\d\d/\d\d\d\d\d\d\d\d")
matches = phone_number_regex.findall(
"My phone number is: 0689/13371337. Yours is 0689/13381338."
)
Mit Gruppen liefert findall Tupel:
phone_number_regex = compile(r"(\d\d\d\d)(/)(\d\d\d\d\d\d\d\d)")
matches = phone_number_regex.findall(
"My phone number is: 0689/13371337. Yours is 0689/13381338."
)
for match in matches:
print("".join(match))
Merksatz
File I/O bringt Daten ins Skript. Regex findet darin die Muster, die man automatisiert weiterverarbeiten will.
Zuletzt aktualisiert: 6. Juni 2026