Python Schulung – Kursbezug
Merksatz: Erst strukturiert (CSV/JSON) arbeiten – RegEx ist super für Text, aber kein Ersatz für saubere Formate.
Worum geht’s?
- Dateien lesen/schreiben mit Encoding (
utf-8) undpathlib. - CSV mit
csv.DictReader/DictWriterverarbeiten. - JSON laden/speichern mit
json.load/json.dump. - Textdaten mit RegEx (
re) validieren & extrahieren (z.B. Preis, PLZ, E-Mail).
Lehr-/Lernziele
- (LZ1) Dateien sicher lesen/schreiben (Encoding, Pfade, Fehlerfälle) und
pathlibnutzen. - (LZ2) CSV-Daten mit Headern einlesen, Zeilen als Dict verarbeiten und wieder als CSV ausgeben.
- (LZ3) JSON als Liste/Dict laden und strukturierte Ergebnisse speichern.
- (LZ4) mit RegEx typische Textmuster finden/prüfen (Extraktion + einfache Validierung).
Wie Sie die Ziele erreichen: Wir verarbeiten „Kurszeilen“ im SemaTrain-Kontext (Beispieldaten). Am Ende bauen Sie einen Mini-Parser: CSV → Auswertung → JSON-Export + RegEx-Checks.
Pfade & Textdateien (pathlib + utf-8)
from pathlib import Path
basis_ordner = Path("daten") # relativer Ordner
basis_ordner.mkdir(exist_ok=True)
dateipfad = basis_ordner / "notiz.txt"
# Schreiben
text = "SemaTrain | Python Schulung\nOrt: Hamburg\nFormat: Online\n"
dateipfad.write_text(text, encoding="utf-8")
# Lesen
inhalt = dateipfad.read_text(encoding="utf-8")
print(inhalt)
# Robust: Existenz prüfen
if not dateipfad.exists():
print("Datei fehlt!")Typische Fehlerfälle (Encoding/Datei fehlt)
from pathlib import Path
dateipfad = Path("daten") / "unbekannt.txt"
try:
inhalt = dateipfad.read_text(encoding="utf-8")
except FileNotFoundError:
print("Datei nicht gefunden:", dateipfad)
except UnicodeDecodeError:
print("Encoding-Problem: Datei ist vermutlich nicht utf-8.")CSV lesen/schreiben (DictReader/DictWriter)
import csv
from pathlib import Path
dateipfad = Path("daten") / "kurse.csv"
felder = ["kurs", "standort", "format", "dauer_tage", "preis_euro"]
zeilen = [
{"kurs":"Python Schulung","standort":"Hamburg","format":"Praesenz","dauer_tage":"3","preis_euro":"1490.00"},
{"kurs":"Python Schulung","standort":"Berlin","format":"Online","dauer_tage":"3","preis_euro":"1390.00"},
{"kurs":"Python Schulung","standort":"Koeln","format":"Online","dauer_tage":"2","preis_euro":"990.00"},
]
with dateipfad.open("w", newline="", encoding="utf-8") as f:
writer = csv.DictWriter(f, fieldnames=felder, delimiter=";")
writer.writeheader()
writer.writerows(zeilen)
print("CSV geschrieben:", dateipfad)import csv
from pathlib import Path
dateipfad = Path("daten") / "kurse.csv"
with dateipfad.open("r", newline="", encoding="utf-8") as f:
reader = csv.DictReader(f, delimiter=";")
for zeile in reader:
# Strings -> Typen (Beispiel)
dauer_tage = int(zeile["dauer_tage"])
preis_euro = float(zeile["preis_euro"])
print(zeile["standort"], zeile["format"], dauer_tage, preis_euro)JSON laden/speichern
import json
from pathlib import Path
dateipfad = Path("daten") / "auswertung.json"
auswertung = {
"anbieter": "SemaTrain",
"kurs": "Python Schulung",
"standorte": ["Hamburg", "Berlin", "Koeln"],
"hinweis": "Beispieldaten",
}
# Speichern (pretty)
dateipfad.write_text(json.dumps(auswertung, ensure_ascii=False, indent=2), encoding="utf-8")
# Laden
geladen = json.loads(dateipfad.read_text(encoding="utf-8"))
print(geladen["anbieter"], geladen["standorte"])RegEx (re): Finden, Extrahieren, Validieren
Extraktion (Preis/PLZ)
import re
text = "Python Schulung | PLZ 20095 | Preis 1490.00 EUR | Kontakt: training@sematrain.de"
muster_preis = r"Preis\s+(\d+(?:\.\d{2})?)\s*EUR"
muster_plz = r"PLZ\s+(\d{5})"
preis = re.search(muster_preis, text)
plz = re.search(muster_plz, text)
print("Preis:", float(preis.group(1)) if preis else None)
print("PLZ:", plz.group(1) if plz else None)Einfache Validierung (E-Mail)
import re
def ist_email(text: str) -> bool:
# pragmatisch (kein RFC-Monster)
muster = r"^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$"
return re.match(muster, text) is not None
tests = ["training@sematrain.de", "info@", "max@firma", "max@firma.de"]
for t in tests:
print(t, "->", ist_email(t))Bonus: re.findall + Named Groups
import re
text = """
Kurs=Python Schulung; Ort=Hamburg; Format=Online; Preis=1390.00
Kurs=Python Schulung; Ort=Berlin; Format=Online; Preis=1290.00
"""
muster = r"Ort=(?P<ort>[A-Za-z]+);\s*Format=(?P<format>[A-Za-z]+);\s*Preis=(?P<preis>\d+\.\d{2})"
treffer = re.findall(muster, text)
print("Findall (Tupel):", treffer)
for m in re.finditer(muster, text):
print("Named:", m.group("ort"), m.group("format"), float(m.group("preis")))Praxisaufgabe (Mini)
Sie bauen eine kleine Pipeline: CSV → Berechnung → JSON-Export + RegEx-Checks.
Beitrag zu den Lehr-/Lernzielen: LZ1 (Pfade/Dateien), LZ2 (CSV), LZ3 (JSON), LZ4 (RegEx).
- (LZ2) Lesen Sie
kurse.csv(Delimiter „;“) und konvertieren Siedauer_tage/preis_euro. - (LZ3) Berechnen Sie
tagespreis = preis_euro / dauer_tageund speichern Sie eine Ergebnisliste als JSON. - (LZ4) Validieren Sie pro Datensatz eine Kontakt-E-Mail (z.B. extra Spalte
kontakt) mit RegEx. - (Bonus) Extrahieren Sie aus einer Textzeile „PLZ 12345“ die PLZ (RegEx-Gruppe).
Lösungsvorschlag anzeigen
import csv
import json
import re
from pathlib import Path
def ist_email(text: str) -> bool:
muster = r"^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$"
return re.match(muster, text) is not None
eingabe = Path("daten") / "kurse.csv"
ausgabe = Path("daten") / "kurse_auswertung.json"
ergebnisse = []
with eingabe.open("r", newline="", encoding="utf-8") as f:
reader = csv.DictReader(f, delimiter=";")
for zeile in reader:
kurs = zeile["kurs"]
standort = zeile["standort"]
format_ = zeile["format"]
dauer_tage = int(zeile["dauer_tage"])
preis_euro = float(zeile["preis_euro"])
# (Beispiel) Kontakt könnte aus CSV kommen – hier setzen wir beispielhaft:
kontakt = zeile.get("kontakt") or "training@sematrain.de"
datensatz = {
"kurs": kurs,
"standort": standort,
"format": format_,
"dauer_tage": dauer_tage,
"preis_euro": preis_euro,
"tagespreis_euro": round(preis_euro / dauer_tage, 2),
"kontakt": kontakt,
"kontakt_ok": ist_email(kontakt),
}
ergebnisse.append(datensatz)
ausgabe.write_text(json.dumps(ergebnisse, ensure_ascii=False, indent=2), encoding="utf-8")
print("JSON gespeichert:", ausgabe)
# Bonus: PLZ aus Text extrahieren
text = "Ort: Hamburg | PLZ 20095 | Preis 1490.00 EUR"
m = re.search(r"PLZ\s+(\d{5})", text)
print("PLZ:", m.group(1) if m else None)Kurz-Takeaways
- LZ1:
pathlib+utf-8+try/except= robuste Datei-IO. - LZ2: CSV mit
DictReaderist schnell & gut für „Tabellen“-Daten. - LZ3: JSON ist ideal, um strukturierte Ergebnisse zu speichern/weiterzugeben.
- LZ4: RegEx: Extraktion/Checks – aber nicht „alles damit lösen“.