Scripting

File I/O und Regex

Dateien lesen und schreiben, with, Text- und Binärmodus, reguläre Ausdrücke, Gruppen, Greedy Matching und findall.

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:

ModusBedeutung
rText lesen
wText schreiben, überschreibt Datei
aText anhängen
rbBinär lesen
wbBinä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

AusdruckBedeutung
`ab`
a+ein oder mehrere a
a\\sa gefolgt von Whitespace
\\d{2,7}zwei bis sieben Ziffern
1337$endet mit 1337
^1337beginnt 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