#!/usr/bin/env python3 """ Einfacher Lotto 6aus49 Data Updater Manuelle Eingabe oder CSV-Import von neuen Ziehungen. Perfekt als Fallback wenn Web-Scraping oder APIs nicht funktionieren. """ import pandas as pd from datetime import datetime import shutil import os def load_existing_data(data_file): """Lädt existierende Daten.""" print("📂 Lade existierende Daten...") if not os.path.exists(data_file): print(" ⚠️ Datei existiert nicht - erstelle neue") return pd.DataFrame(columns=['datum', 'Z1', 'Z2', 'Z3', 'Z4', 'Z5', 'Z6', 'SZ']) df = pd.read_csv(data_file, sep=';') df['datum'] = pd.to_datetime(df['datum'], format='%Y-%m-%d', errors='coerce') print(f" ✅ {len(df)} Ziehungen geladen") if len(df) > 0: print(f" 📅 Neueste: {df['datum'].max().strftime('%Y-%m-%d')}") return df def create_backup(data_file): """Erstellt Backup.""" if not os.path.exists(data_file): return print("\n💾 Erstelle Backup...") timestamp = datetime.now().strftime("%Y%m%d_%H%M%S") # Backup im Lotto/data/backups Verzeichnis parent_dir = os.path.dirname(data_file) lotto_dir = os.path.join(parent_dir, "Lotto") backup_dir = os.path.join(lotto_dir, "data", "backups") os.makedirs(backup_dir, exist_ok=True) backup_file = os.path.join(backup_dir, f"{os.path.basename(data_file)}.backup_{timestamp}") shutil.copy2(data_file, backup_file) print(f" ✅ Backup: {os.path.basename(backup_file)}") def manual_input_mode(): """Manuelle Eingabe von Ziehungen.""" print("\n⌨️ MANUELLE EINGABE") print("=" * 70) print("Format: YYYY-MM-DD Z1 Z2 Z3 Z4 Z5 Z6 SZ") print("Beispiel: 2025-01-22 7 14 21 28 35 42 3") print("Leer lassen zum Beenden.\n") draws = [] while True: user_input = input(f"Ziehung {len(draws) + 1}: ").strip() if not user_input: break try: parts = user_input.split() if len(parts) != 8: print(" ❌ Ungültiges Format. Bitte 8 Werte eingeben.") continue date_obj = datetime.strptime(parts[0], '%Y-%m-%d') numbers = [int(parts[i]) for i in range(1, 7)] superzahl = int(parts[7]) # Validierung if not all(1 <= n <= 49 for n in numbers): print(" ❌ Hauptzahlen müssen zwischen 1 und 49 liegen.") continue if not 0 <= superzahl <= 9: print(" ❌ Superzahl muss zwischen 0 und 9 liegen.") continue if len(set(numbers)) != 6: print(" ❌ Hauptzahlen müssen eindeutig sein.") continue # Sortiere Zahlen numbers_sorted = sorted(numbers) draws.append({ 'datum': date_obj, 'Z1': numbers_sorted[0], 'Z2': numbers_sorted[1], 'Z3': numbers_sorted[2], 'Z4': numbers_sorted[3], 'Z5': numbers_sorted[4], 'Z6': numbers_sorted[5], 'SZ': superzahl }) print(f" ✅ Hinzugefügt: {date_obj.strftime('%Y-%m-%d')} | " f"{'-'.join(map(str, numbers_sorted))} | SZ: {superzahl}") except ValueError as e: print(f" ❌ Fehler: {e}") continue return draws def csv_import_mode(): """CSV-Import von Ziehungen.""" print("\n📁 CSV-IMPORT") print("=" * 70) print("CSV-Format: datum;Z1;Z2;Z3;Z4;Z5;Z6;SZ") print("Beispiel: 2025-01-22;7;14;21;28;35;42;3\n") csv_file = input("Pfad zur CSV-Datei: ").strip() if not os.path.exists(csv_file): print(f" ❌ Datei nicht gefunden: {csv_file}") return [] try: df_import = pd.read_csv(csv_file, sep=';') df_import['datum'] = pd.to_datetime(df_import['datum'], format='%Y-%m-%d', errors='coerce') draws = df_import.to_dict('records') print(f" ✅ {len(draws)} Ziehungen aus CSV geladen") # Zeige erste 3 for i, draw in enumerate(draws[:3]): nums = f"{draw['Z1']}-{draw['Z2']}-{draw['Z3']}-{draw['Z4']}-{draw['Z5']}-{draw['Z6']}" print(f" {i+1}. {draw['datum'].strftime('%Y-%m-%d')} | {nums} | SZ: {draw['SZ']}") if len(draws) > 3: print(f" ... und {len(draws) - 3} weitere") return draws except Exception as e: print(f" ❌ Fehler beim Laden: {e}") return [] def merge_and_save(df_existing, new_draws, data_file): """Merged und speichert Daten.""" if not new_draws: print("\n⚠️ Keine neuen Ziehungen zum Hinzufügen") return False print(f"\n🔀 Merge {len(new_draws)} neue Ziehung(en)...") df_new = pd.DataFrame(new_draws) df_combined = pd.concat([df_existing, df_new], ignore_index=True) # Duplikate entfernen before = len(df_combined) df_combined = df_combined.drop_duplicates(subset=['datum'], keep='first') after = len(df_combined) if before - after > 0: print(f" 🗑️ {before - after} Duplikat(e) entfernt") # Sortieren df_combined = df_combined.sort_values('datum', ascending=True).reset_index(drop=True) # Speichern print(f"\n💾 Speichere {len(df_combined)} Ziehungen...") df_export = df_combined.copy() df_export['datum'] = df_export['datum'].dt.strftime('%Y-%m-%d') df_export.to_csv(data_file, sep=';', index=False) print(f" ✅ Gespeichert: {data_file}") print(f" 📊 Vorher: {len(df_existing)} | Neu: {len(df_combined) - len(df_existing)} | Gesamt: {len(df_combined)}") return True def main(): """Hauptfunktion.""" print() print("=" * 70) print(" LOTTO 6AUS49 SIMPLE UPDATER") print(" Manuelle Eingabe oder CSV-Import") print("=" * 70) print() # Datei-Pfad default_file = "/Users/sebastianfrohlich/Library/Mobile Documents/com~apple~CloudDocs/Jupyter Notebooks/Lotto/data/AlleLottozahlen.csv" print(f"Standard-Datei: {default_file}") use_default = input("\nStandard verwenden? (j/n): ").strip().lower() if use_default in ['j', 'ja', 'y', 'yes', '']: data_file = default_file else: data_file = input("Pfad zur Datei: ").strip() print() # Lade existierende Daten df_existing = load_existing_data(data_file) # Backup create_backup(data_file) # Eingabe-Modus wählen print("\n📝 EINGABE-MODUS") print("=" * 70) print("1. Manuelle Eingabe (einzelne Ziehungen)") print("2. CSV-Import (mehrere Ziehungen)") print() mode = input("Wahl (1/2): ").strip() if mode == '2': new_draws = csv_import_mode() else: new_draws = manual_input_mode() # Merge und speichern success = merge_and_save(df_existing, new_draws, data_file) print() print("=" * 70) if success: print("✅ UPDATE ERFOLGREICH") else: print("⚠️ KEINE ÄNDERUNGEN") print("=" * 70) if __name__ == "__main__": main()