This commit is contained in:
2025-06-19 16:30:12 +00:00
parent 3123b062bd
commit 422ba0a8c4

View File

@@ -10280,33 +10280,66 @@ class DataProcessor:
# Der globale Root Logger wird in main() konfiguriert
# logger = logging.getLogger(__name__) # Diesen Logger gibt es schon, keine Neudefinition hier
def parse_arguments():
"""
Parst und validiert Kommandozeilen-Argumente.
"""
parser = argparse.ArgumentParser(description="Automatisierte Unternehmensbewertung v1.7.8")
parser.add_argument(
'--mode', type=str, choices=[
'full_run', 'reeval', 'find_wiki_serp', 'website_lookup', 'check_urls',
'contacts', 'update_wiki_suggestions', 'wiki_reextract_missing_an',
'website_details', 'train_technician_model', 'alignment', 'reparatur_sitz',
'plausi_check_data', 'combined_all', 'branch_eval', 'suggest_parents', 'analyze_ml_by_branch'
],
help="Ausführungsmodus des Skripts."
)
parser.add_argument('--limit', type=int, help="Maximale Anzahl zu verarbeitender Zeilen.")
parser.add_argument('--start_sheet_row', type=int, help="Startzeile im Google Sheet (1-basiert).")
parser.add_argument('--end_sheet_row', type=int, help="Endzeile im Google Sheet (inklusiv).")
parser.add_argument(
'--steps', type=str,
default='wiki,chat,web,ml_predict',
help="Zu durchlaufende Schritte, kommagetrennt (z.B. 'wiki,chat'). Standard: 'wiki,chat,web,ml_predict'"
)
# Argumente für find_wiki_serp
parser.add_argument('--min_employees', type=int, default=500, help="Mindestanzahl Mitarbeiter für find_wiki_serp Modus.")
parser.add_argument('--min_umsatz', type=float, default=200.0, help="Mindestumsatz in Mio. € für find_wiki_serp Modus.")
# Argumente für das Speichern von ML-Modellen
parser.add_argument('--model_out', type=str, default=MODEL_FILE, help="Ausgabepfad für das trainierte ML-Modell.")
parser.add_argument('--imputer_out', type=str, default=IMPUTER_FILE, help="Ausgabepfad für den trainierten Imputer.")
parser.add_argument('--patterns_out', type=str, default=PATTERNS_FILE_JSON, help="Ausgabepfad für die Feature-Patterns (JSON).")
return parser.parse_args()
def main():
"""
Haupteinstiegspunkt des Skripts.
Verarbeitet Kommandozeilen-Argumente, richtet Logging ein,
initialisiert Komponenten und dispatchet zu den passenden Modi.
"""
# WICHTIG: Globale Variable LOG_FILE wird benoetigt (Initialisierung Block 3)
# 1. Argumente parsen
args = parse_arguments()
# 2. Logging konfigurieren
global LOG_FILE
logger = logging.getLogger(__name__) # <<< JETZT AN DER RICHTIGEN STELLE
# --- Initial Logging Setup (Konfiguration von Level und Format) ---
# Diese Konfiguration wird wirksam, sobald die Handler hinzugefuegt werden.
# Standard-Logging Level festlegen (aus Config Block 1)
log_level = logging.DEBUG if getattr(Config, 'DEBUG', False) else logging.INFO
log_format = '%(asctime)s - %(levelname)-8s - %(name)-25s - %(message)s' # <<< DIESE ZEILE HINZUFÜGEN/KORRIGIEREN
# Root-Logger konfigurieren (mit Console Handler, File Handler wird spaeter hinzugefuegt)
# handlers=[] verhindert default Console Handler, wir fuegen ihn manuell hinzu fuer mehr Kontrolle
logging.basicConfig(level=log_level, format=log_format, handlers=[]) # log_format wird hier bereits verwendet
logger.info("Lade Konfigurationsdaten...")
log_format = '%(asctime)s - %(levelname)-8s - %(name)-25s - %(message)s'
# Lade die Schemata und Mappings NACH dem Logging-Setup
# Sofort einen Konsolen-Handler hinzufügen, damit frühe Meldungen sichtbar sind
logging.basicConfig(level=log_level, format=log_format, handlers=[logging.StreamHandler()])
logger = logging.getLogger(__name__)
# 3. Globale Konfigurationsdaten laden (jetzt wo das Logging läuft)
logger.info("Lade Konfigurationsdateien...")
Config.load_api_keys()
ziel_schema, fokus_branchen = load_target_schema()
branch_mapping_dict = load_branch_mapping()
# Wenn das Laden fehlschlägt, können wir hier sicher abbrechen
# Prüfung, ob das Laden erfolgreich war
if not ziel_schema:
logger.critical("Ziel-Branchenschema konnte nicht geladen werden. Skriptabbruch.")
return
@@ -10314,43 +10347,16 @@ def main():
logger.critical("Branchen-Mapping konnte nicht geladen werden. Skriptabbruch.")
return
args = parse_arguments()
# Initialisiere den DataProcessor und übergebe ihm die geladenen Daten
# 4. Hauptkomponenten initialisieren und die geladenen Daten übergeben
logger.info("Initialisiere Hauptkomponenten...")
sheet_handler = GoogleSheetHandler(Config.SHEET_ID, Config.SERVICE_ACCOUNT_FILE, Config.TOKEN_FILE)
wiki_scraper = WikipediaScraper()
# +++ WICHTIGE ÄNDERUNG HIER +++
# Wir übergeben die Daten an den Konstruktor
data_processor = DataProcessor(sheet_handler, wiki_scraper, ziel_schema, fokus_branchen, branch_mapping_dict)
logger.info("DataProcessor erfolgreich initialisiert.")
ZIEL_BRANCHENSCHEMA, FOKUS_BRANCHEN = load_target_schema() # Zeile 10277
BRANCH_MAPPING = load_branch_mapping()
# Console Handler explizit hinzufuegen
console_handler = logging.StreamHandler()
console_handler.setLevel(log_level) # Nimm das globale Level
console_handler.setFormatter(logging.Formatter(log_format)) # Jetzt sollte log_format definiert sein
# Pruefen, ob nicht schon ein Console Handler vorhanden ist (z.B. bei wiederholten Aufrufen in Tests)
if not any(isinstance(h, logging.StreamHandler) for h in logging.getLogger('').handlers):
logging.getLogger('').addHandler(console_handler)
# Testnachricht (geht nur an Konsole, da File Handler noch fehlt)
logger.debug("DEBUG Logging initial konfiguriert (nur Konsole).")
logger.info("INFO Logging initial konfiguriert (nur Konsole).")
# --- Initialisierung (Argument Parser) ---
current_script_version = getattr(Config, 'VERSION', 'unknown') # Aus Config Block 1
parser = argparse.ArgumentParser(
description=f"Firmen-Datenanreicherungs-Skript {current_script_version}. Automatisiert Anreicherung und Validierung aus Google Sheets.",
formatter_class=argparse.RawTextHelpFormatter # Behaelt Formatierung im Help-Text
)
# 5. Modus-Dispatching (der Rest Ihrer main-Funktion)
start_time = time.time()
# Liste der gueltigen Modi - MUSS mit den elif-Zweigen unten uebereinstimmen!
# Kategorisiert fuer die Menue-Ausgabe