Ein Python-Skript, das aus einer CSV-Teilnehmerliste eine Word-Datei
(begegnungen.docx) mit Spielplan und/oder Adresslisten fuer fuenf Turniertypen
erzeugt. Jeder Abschnitt beginnt auf einer neuen Seite und hat eine eigene
Kopfzeile sowie eine Seitenzaehlung, die bei 1 startet.
- Voraussetzungen
- Schnellstart
- CSV-Format
- Turniere und Eintraege
- Ausgabedatei
- Fehlerbehandlung
- Projektstruktur
| Werkzeug | Mindestversion | Zweck |
|---|---|---|
| Python | 3.10 | Laufzeit |
| python-docx | beliebig | Word-Datei erzeugen |
| uv | beliebig | Abhaengigkeiten automatisch laden (empfohlen) |
| just | beliebig | Kurzbefehle (optional) |
uv und just sind optional; das Skript laeuft auch mit einem standard
Python-Interpreter und manuell installiertem python-docx.
# Empfohlen: uv laedt python-docx automatisch aus dem PEP-723-Header
uv run begegnungen.py # Spielplan + Adressen (Standard)
uv run begegnungen.py --no-addresses # nur Spielplan
uv run begegnungen.py --no-pairings # nur Adressliste
# Kurzbefehle mit Just
just all # Spielplan + Adressliste
just plan # nur Spielplan
just addresses # nur Adressliste
# Oder mit bereits installiertem python-docx
pip install python-docx
python begegnungen.pyDie Datei teilnehmer.csv muss sich im selben Verzeichnis befinden.
Das Ergebnis wird als begegnungen.docx im selben Verzeichnis gespeichert.
| Option | Standard | Wirkung |
|---|---|---|
--pairings / --no-pairings |
an | Spielplan-Abschnitt erzeugen / weglassen |
--addresses / --no-addresses |
an | Adresslisten-Abschnitt erzeugen / weglassen |
Beide Optionen sind standardmaessig aktiv; die --no-*-Varianten schalten den
jeweiligen Abschnitt ab. Sind beide deaktiviert, bricht das Skript mit einer
Fehlermeldung ab.
Spalten in dieser Reihenfolge (Kopfzeile in der ersten Zeile erforderlich):
Nachname,Vorname,Telefonnummer,Email,Turniere
- Telefonnummer und Email erscheinen nur in der Adressliste, nicht im Spielplan; sie duerfen leer bleiben.
- Die Spalte Turniere enthaelt die Turnier-Eintraege einer Person,
getrennt durch Semikolon, z.B.
DE;DD5;MD1. - Eine Person kann 0 Turnier-Eintraege haben (nimmt an keinem Turnier teil) bis realistisch maximal drei (Einzel, Doppel, Mixed).
Beispielzeile:
Mustermann,Maja,+49 170 1234567,maja@example.com,DE;DD5;MD1
Maja spielt Dameneinzel, ist im Damendoppel-Paar 5 und im Mixed-Doppel-Paar 1.
Eine Vorlage ohne echte Daten befindet sich in teilnehmer-template.csv.
| Kuerzel | Langname | Typ |
|---|---|---|
| HE | Herreneinzel | Einzel |
| DE | Dameneinzel | Einzel |
| HD | Herrendoppel | Doppel |
| DD | Damendoppel | Doppel |
| MD | Mixed-Doppel | Doppel |
Einfach das Kuerzel, ohne Zahl: HE, DE.
Kuerzel direkt gefolgt von einer numerischen Paar-ID (kein Trennzeichen):
HD27 -> Herrendoppel, Paar Nr. 27
MD1 -> Mixed-Doppel, Paar Nr. 1
DD5 -> Damendoppel, Paar Nr. 5
Regel: Jede Paar-ID muss in der gesamten CSV genau 0-mal oder 2-mal vorkommen. Eine ID, die 1-mal, 3-mal oder oefter erscheint, ist fehlerhaft und wird verworfen.
Durch einen einzelnen Buchstaben direkt nach dem Turnier-Kuerzel lassen sich Untergruppen (z.B. Altersklassen oder Leistungsgruppen) innerhalb eines Turniers definieren. Das Skript erzeugt dann fuer jede Untergruppe einen eigenen Abschnitt in der Ausgabedatei.
Einzel:
HEa -> Herreneinzel, Gruppe a
HEb -> Herreneinzel, Gruppe b
Doppel: Buchstabe zwischen Kuerzel und Paar-Nummer:
HDa3 -> Herrendoppel, Gruppe a, Paar Nr. 3
HDb7 -> Herrendoppel, Gruppe b, Paar Nr. 7
MDa2 -> Mixed-Doppel, Gruppe a, Paar Nr. 2
Ein Turnier ohne Gruppenangabe (z.B. HE) und dasselbe Turnier mit
Gruppenangabe (z.B. HEa) koennen gleichzeitig in der CSV vorkommen;
sie werden als getrennte Turnier-Abschnitte behandelt.
- Einzel: Jede Spielerin / jeder Spieler tritt gegen jede andere Person an (Round-Robin).
- Doppel: Jedes Paar tritt gegen jedes andere Paar an (Round-Robin).
In der Spielplan-Ausgabe erscheint nur Vorname Nachname (mit Paar-ID in Klammern) – Telefonnummer und E-Mail bleiben ausschliesslich in der Adressliste.
begegnungen.docx enthaelt pro Turnier (bzw. Untergruppe) bis zu zwei
Abschnitte – Adressliste und Spielplan – je nach den gewaehlten Optionen.
Jeder Abschnitt beginnt auf einer neuen Seite.
Zweispaltige Tabelle mit Kontaktdaten aller Teilnehmenden des Turniers:
| Element | Inhalt |
|---|---|
| Kopfzeile | Turniername (Anzahl) – Adressen, fett, 14 pt |
| Fusszeile | Seite N (dynamisches PAGE-Feld) |
| Tabelleninhalt | Name [Paar-ID], Telefonnummer, E-Mail |
Bei Doppeln werden beide Partnerinnen/Partner eines Paares als Block in einer Zelle zusammengefasst.
Tabelle aller Round-Robin-Begegnungen des Turniers:
| Element | Inhalt |
|---|---|
| Kopfzeile | Turniername (Anzahl) bzw. … – Spielplan (wenn beide Modi aktiv), fett, 14 pt |
| Fusszeile | Seite N (dynamisches PAGE-Feld) |
| Seitenzaehlung | beginnt pro Abschnitt bei 1 |
| Tabellenspalten | Spieler/Team 1 – Spieler/Team 2 – Satz 1 – Satz 2 – Tiebreak |
Die Tabellenkopfzeile wird bei Seitenumbruechen wiederholt. Bei Doppeln stehen beide Partnernamen untereinander in einer Zelle.
Warnungen werden auf stderr ausgegeben; der betroffene Eintrag wird verworfen. Alle uebrigen, korrekten Turnier-Anmeldungen derselben Person bleiben gueltig.
| Situation | Reaktion |
|---|---|
| Doppel-Paar-ID kommt 1-, 3- oder mehrfach vor | WARNUNG + Eintrag verwerfen |
Doppel-Kuerzel ohne Zahl (z.B. nur HD oder HDa) |
WARNUNG + Eintrag verwerfen |
Einzel-Kuerzel mit Zahl (z.B. HE3) |
WARNUNG + Eintrag verwerfen |
Eintrag passt nicht zum Muster [A-Z]{2}[A-Za-z]?[0-9]* |
WARNUNG + Eintrag verwerfen |
--pairings und --addresses beide deaktiviert |
Fehler + Abbruch |
Beispiel-Ausgabe bei einem Fehler:
WARNUNG: Paar-ID 'HD5' kommt 1x vor (erwartet: 2x). Beteiligte: Jakob Boss. Ignoriert.
pairset/
├── begegnungen.py # Hauptskript
├── teilnehmer.csv # Teilnehmerliste (echte Daten, git-crypt verschluesselt)
├── teilnehmer-template.csv # Vorlage fuer das CSV-Format ohne echte Daten
├── justfile # just-Konfiguration: plan / addresses / all
└── README.md # Diese Datei
Datenschutz-Hinweis:
teilnehmer.csvkann echte persoenliche Daten enthalten (Namen, Telefonnummern, E-Mail-Adressen). Die Datei ist im Repository mit git-crypt verschluesselt. Die mitgelieferteteilnehmer-template.csvzeigt das Format ohne echte Daten.