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()