list_generator.py hinzugefügt
This commit is contained in:
138
list_generator.py
Normal file
138
list_generator.py
Normal file
@@ -0,0 +1,138 @@
|
|||||||
|
import csv
|
||||||
|
from datetime import datetime
|
||||||
|
import collections
|
||||||
|
import os # For path handling, though not strictly needed if files are in same dir
|
||||||
|
|
||||||
|
# --- Konfiguration ---
|
||||||
|
CSV_FILENAME = 'Namensliste.csv'
|
||||||
|
OUTPUT_FILENAME = 'Gruppenlisten_Output.txt'
|
||||||
|
|
||||||
|
EINRICHTUNG = "Kinderhaus St. Martin Neuching"
|
||||||
|
# Bitte das Datum anpassen, falls die Annahme nicht korrekt war:
|
||||||
|
# Mögliche Optionen:
|
||||||
|
# FOTODATUM = "02.06. & 05.06.2025" # Für zwei spezifische Tage
|
||||||
|
# FOTODATUM = "02.06. + 05.06.2025" # Alternative für zwei Tage
|
||||||
|
FOTODATUM = "02. - 05.06.2025" # Für einen Zeitraum
|
||||||
|
|
||||||
|
GRUPPENNAME_SUFFIX = "gruppe" # Wird an den Gruppennamen aus der CSV angehängt
|
||||||
|
|
||||||
|
FOTOGRAF_NAME = "Kinderfotos Erding"
|
||||||
|
FOTOGRAF_ADRESSE = "Gartenstr. 10 85445 Oberding"
|
||||||
|
FOTOGRAF_WEB = "www.kinderfotos-erding.de"
|
||||||
|
FOTOGRAF_TEL = "08122-8470867"
|
||||||
|
# --- Ende Konfiguration ---
|
||||||
|
|
||||||
|
def generate_group_lists():
|
||||||
|
"""
|
||||||
|
Liest die CSV-Datei, verarbeitet die Daten und generiert die gruppierten Listen.
|
||||||
|
"""
|
||||||
|
kinder_nach_gruppen = collections.defaultdict(list)
|
||||||
|
|
||||||
|
try:
|
||||||
|
# 'utf-8-sig' handhabt das BOM (Byte Order Mark), falls vorhanden
|
||||||
|
with open(CSV_FILENAME, mode='r', encoding='utf-8-sig', newline='') as csvfile:
|
||||||
|
# Korrektur für das BOM-Zeichen, falls es manuell am Anfang der CSV-Daten steht
|
||||||
|
# und nicht durch utf-8-sig entfernt wird (bei String-Input nötig, bei Datei seltener)
|
||||||
|
# content = csvfile.read()
|
||||||
|
# if content.startswith('\ufeff'):
|
||||||
|
# content = content[1:]
|
||||||
|
# reader = csv.DictReader(content.splitlines(), delimiter=';') # Für String-Input
|
||||||
|
|
||||||
|
reader = csv.DictReader(csvfile, delimiter=';')
|
||||||
|
for row in reader:
|
||||||
|
vorname = row.get('Vorname', '').strip()
|
||||||
|
nachname = row.get('Nachname', '').strip()
|
||||||
|
gruppe_original = row.get('Gruppe', '').strip()
|
||||||
|
|
||||||
|
if not vorname or not nachname or not gruppe_original:
|
||||||
|
print(f"Warnung: Zeile übersprungen wegen fehlender Daten: {row}")
|
||||||
|
continue
|
||||||
|
|
||||||
|
kinder_nach_gruppen[gruppe_original].append({
|
||||||
|
'Nachname': nachname,
|
||||||
|
'Vorname': vorname
|
||||||
|
})
|
||||||
|
except FileNotFoundError:
|
||||||
|
print(f"FEHLER: Die Datei '{CSV_FILENAME}' wurde nicht gefunden.")
|
||||||
|
return
|
||||||
|
except Exception as e:
|
||||||
|
print(f"FEHLER beim Lesen der CSV-Datei: {e}")
|
||||||
|
return
|
||||||
|
|
||||||
|
if not kinder_nach_gruppen:
|
||||||
|
print("Keine Daten aus der CSV-Datei geladen.")
|
||||||
|
return
|
||||||
|
|
||||||
|
# Kinder innerhalb jeder Gruppe sortieren
|
||||||
|
for gruppe in kinder_nach_gruppen:
|
||||||
|
kinder_nach_gruppen[gruppe].sort(key=lambda x: (x['Nachname'].lower(), x['Vorname'].lower()))
|
||||||
|
|
||||||
|
# Alphabetisch sortierte Gruppenliste für die Ausgabe
|
||||||
|
sorted_gruppen_namen = sorted(kinder_nach_gruppen.keys())
|
||||||
|
|
||||||
|
gesamtdokument_teile = []
|
||||||
|
stand_zeit = datetime.now().strftime("%d.%m.%Y %H:%M Uhr")
|
||||||
|
|
||||||
|
for gruppe_original in sorted_gruppen_namen:
|
||||||
|
kinder_liste = kinder_nach_gruppen[gruppe_original]
|
||||||
|
anzahl_kinder = len(kinder_liste)
|
||||||
|
|
||||||
|
# Gruppennamen für die Anzeige anpassen
|
||||||
|
gruppe_display_name = gruppe_original + GRUPPENNAME_SUFFIX
|
||||||
|
|
||||||
|
seiteninhalt = []
|
||||||
|
|
||||||
|
# Header
|
||||||
|
# Für die Spaltenausrichtung in Google Docs ist es besser, Tabulatoren zu verwenden
|
||||||
|
# und dann in Docs "Text in Tabelle umwandeln" zu nutzen oder manuell zu formatieren.
|
||||||
|
seiteninhalt.append(f"{EINRICHTUNG}\t\t\t{FOTOGRAF_NAME}")
|
||||||
|
seiteninhalt.append(FOTODATUM)
|
||||||
|
seiteninhalt.append("") # Leerzeile
|
||||||
|
|
||||||
|
# Tabellenkopf
|
||||||
|
# Die Spaltenbreiten hier sind nur für die Textausgabe gedacht.
|
||||||
|
# Feste Breiten sind besser als nur Tabs für die reine Textansicht.
|
||||||
|
seiteninhalt.append(f"{'Nachname':<25}{'Vorname':<25}{'Gruppe'}")
|
||||||
|
seiteninhalt.append("-" * (25 + 25 + len(gruppe_display_name) + 2)) # Linie unter Kopf
|
||||||
|
|
||||||
|
# Tabellenzeilen
|
||||||
|
for kind in kinder_liste:
|
||||||
|
seiteninhalt.append(f"{kind['Nachname']:<25}{kind['Vorname']:<25}{gruppe_display_name}")
|
||||||
|
|
||||||
|
seiteninhalt.append("") # Leerzeile
|
||||||
|
|
||||||
|
# Footer
|
||||||
|
seiteninhalt.append(f"{anzahl_kinder} angemeldete Kinder")
|
||||||
|
seiteninhalt.append("")
|
||||||
|
seiteninhalt.append("Dies ist die Liste der bereits angemeldeten Kinder. Bitte die Eltern der noch fehlenden")
|
||||||
|
seiteninhalt.append("Kinder an die Anmeldung erinnern.")
|
||||||
|
seiteninhalt.append("")
|
||||||
|
seiteninhalt.append(f"Stand {stand_zeit}")
|
||||||
|
seiteninhalt.append("\n") # Eine zusätzliche Leerzeile vor Fotografen-Block
|
||||||
|
seiteninhalt.append(FOTOGRAF_NAME)
|
||||||
|
seiteninhalt.append(FOTOGRAF_ADRESSE)
|
||||||
|
seiteninhalt.append(FOTOGRAF_WEB)
|
||||||
|
seiteninhalt.append(FOTOGRAF_TEL)
|
||||||
|
|
||||||
|
gesamtdokument_teile.append("\n".join(seiteninhalt))
|
||||||
|
|
||||||
|
# Seiten mit Trenner zusammenfügen
|
||||||
|
final_output_text = "\n\n--- SEITENWECHSEL / PAGE BREAK ---\n\n".join(gesamtdokument_teile)
|
||||||
|
|
||||||
|
try:
|
||||||
|
with open(OUTPUT_FILENAME, mode='w', encoding='utf-8') as outfile:
|
||||||
|
outfile.write(final_output_text)
|
||||||
|
print(f"Erfolg! Die Listen wurden in '{OUTPUT_FILENAME}' gespeichert.")
|
||||||
|
except Exception as e:
|
||||||
|
print(f"FEHLER beim Schreiben der Ausgabedatei: {e}")
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
# Hier können Sie das Datum ggf. noch dynamischer setzen oder abfragen
|
||||||
|
# Beispiel: aktuelles_jahr = datetime.now().year
|
||||||
|
# FOTODATUM = f"02. - 05.06.{aktuelles_jahr}"
|
||||||
|
|
||||||
|
# Überprüfen Sie Ihre Datumseinstellung:
|
||||||
|
print(f"Info: Verwendetes Fotodatum: {FOTODATUM}")
|
||||||
|
print(f"Info: Gruppennamen werden mit Suffix '{GRUPPENNAME_SUFFIX}' versehen.")
|
||||||
|
|
||||||
|
generate_group_lists()
|
||||||
Reference in New Issue
Block a user