Ich habe diesen Code: 

import csv
import os
import re
from pathlib import Path
from collections import defaultdict

def find_file_in_directory(directory, filename):
    """Sucht nach einer Datei in einem Verzeichnis und seinen Unterverzeichnissen"""
    for root, dirs, files in os.walk(directory):
        if filename in files:
            return os.path.join(root, filename)
    return None

def ensure_directory_exists(directory):
    """Stellt sicher, dass das Verzeichnis existiert, erstellt es ggf."""
    Path(directory).mkdir(parents=True, exist_ok=True)

def process_csv_files():
    # Pfade zu den CSV-Dateien
    machine_list = "001_DnumberMachineList_20250704_133211 - Kopie.csv"
    backup_list = "002_DnumberBackupList_20250704_133418.csv"

    # Verzeichnis für die Suche
    search_directory = r"C:\Users\Meschd\Documents\Python_Mesch\004_NC-Code-comparing\NC_CODES_CIMCO_txt"

    # Verzeichnis für die Ausgabedateien
    output_directory = "Programmunterschiede"
    ensure_directory_exists(output_directory)

    # Daten aus den CSV-Dateien lesen
    dnumber_to_filename = {}
    dnumber_to_backup_filenames = defaultdict(list)  # Jetzt eine Liste für mehrere Dateien

    # Erste CSV-Datei verarbeiten (Maschinendateien)
    with open(machine_list, 'r', encoding='utf-8') as file:
        reader = csv.reader(file)
        next(reader)  # Überschrift überspringen
        for row in reader:
            if len(row) >= 2:
                dnumber = row[0].strip()
                filename = row[1].strip()
                dnumber_to_filename[dnumber] = filename

    # Zweite CSV-Datei verarbeiten (Backupdateien)
    with open(backup_list, 'r', encoding='utf-8') as file:
        reader = csv.reader(file)
        next(reader)  # Überschrift überspringen
        for row in reader:
            if len(row) >= 3:
                dnumber = row[0].strip()
                filename = row[2].strip()
                dnumber_to_backup_filenames[dnumber].append(filename)

    # Für jede D-Nummer die Dateien suchen und vergleichen
    for dnumber in dnumber_to_filename:
        if dnumber in dnumber_to_backup_filenames:
            machine_filename = dnumber_to_filename[dnumber]
            backup_filenames = dnumber_to_backup_filenames[dnumber]

            print(f"\nVerarbeite D-Nummer: {dnumber}")
            print(f"Maschinendatei: {machine_filename}")

            # Maschinendatei suchen
            machine_filepath = find_file_in_directory(search_directory, machine_filename)
            if not machine_filepath:
                print(f"Maschinendatei nicht gefunden: {machine_filename}")
                continue

            # Alle Backupdateien vergleichen
            for backup_filename in backup_filenames:
                print(f"\nVergleiche mit Backupdatei: {backup_filename}")

                backup_filepath = find_file_in_directory(search_directory, backup_filename)
                if not backup_filepath:
                    print(f"Backupdatei nicht gefunden: {backup_filename}")
                    continue

                # Output-Pfad erstellen
                output_csv = os.path.join(output_directory,
                                        f"werkzeugparameter_unterschiede_{dnumber}_{Path(backup_filename).stem}.csv")

                # Vergleich durchführen
                try:
                    compare_cnc_files_linewise(
                        file1=machine_filepath,
                        file2=backup_filepath,
                        label1='Maschine',
                        label2='Backup',
                        output_csv=output_csv
                    )
                except Exception as e:
                    print(f"Fehler beim Vergleich der Dateien für D-Nummer {dnumber}: {str(e)}")
        else:
            print(f"Keine Backupdateien gefunden für D-Nummer: {dnumber}")

def parse_cnc_file(filepath):
    """Analysiert eine CNC-Datei und extrahiert Werkzeugparameter"""
    try:
        with open(filepath, 'r', encoding='utf-8') as file:
            lines = file.readlines()
    except UnicodeDecodeError:
        with open(filepath, 'r', encoding='latin-1') as file:
            lines = file.readlines()

    tool_data = []
    current_tool = None
    current_values = {}

    def extract_parameters(line):
        """Extrahiert Parameter aus einer Zeile"""
        extracted = {}
        patterns = {
            'S': r'\bS\s*=?\s*(\d+\.?\d*)',
            'F': r'\bF\s*=?\s*(\d+\.?\d*)',
            '_F1': r'_F1\s*=\s*(\d+\.?\d*)',
            '_F2': r'_F2\s*=\s*(\d+\.?\d*)',
            '_F3': r'_F3\s*=\s*(\d+\.?\d*)',
            '_F4': r'_F4\s*=\s*(\d+\.?\d*)',
            'SDR1': r'SDR1\s*\(\s*(\d+\.?\d*)\s*\)',
            'R3': r'\bR3\s*=?\s*(\d+\.?\d*)',
            'R4': r'\bR4\s*=?\s*(\d+\.?\d*)'
        }
        for key, pattern in patterns.items():
            matches = re.findall(pattern, line)
            if matches:
                extracted[key] = matches
        return extracted

    for line in lines:
        if ';' in line:
            line = line.split(';')[0]
        if '(' in line and ')' in line and 'SDR1' not in line:
            continue

        t_match = re.search(r'\bT(\d+)', line)
        if t_match:
            current_tool = f'T{t_match.group(1)}'
            if current_tool not in current_values:
                current_values[current_tool] = {}

        if current_tool:
            extracted = extract_parameters(line)
            for key, values in extracted.items():
                current_values[current_tool].setdefault(key, []).extend(values)

        if 'M6' in line and current_tool:
            tool_data.append({
                'T': current_tool,
                **current_values[current_tool]
            })
            current_tool = None

    return tool_data

def compare_cnc_files_linewise(file1, file2, label1='Maschine', label2='Backup', output_csv=None):
    """Vergleicht zwei CNC-Dateien und speichert die Unterschiede in einer CSV-Datei"""
    if not output_csv:
        output_csv = 'werkzeugparameter_unterschiede.csv'

    data1 = parse_cnc_file(file1)
    data2 = parse_cnc_file(file2)

    def to_dict(data):
        return {entry['T']: entry for entry in data}

    dict1 = to_dict(data1)
    dict2 = to_dict(data2)

    all_tools = sorted(set(dict1.keys()).union(dict2.keys()))
    differences = []

    for tool in all_tools:
        entry1 = dict1.get(tool, {})
        entry2 = dict2.get(tool, {})
        keys = set(entry1.keys()).union(entry2.keys()) - {'T'}

        for key in sorted(keys):
            val1 = entry1.get(key, [])
            val2 = entry2.get(key, [])

            val1_list = [str(v) for v in val1] if isinstance(val1, list) else [str(val1)]
            val2_list = [str(v) for v in val2] if isinstance(val2, list) else [str(val2)]

            max_len = max(len(val1_list), len(val2_list))
            for i in range(max_len):
                v1 = val1_list[i] if i < len(val1_list) else ''
                v2 = val2_list[i] if i < len(val2_list) else ''

                if v1 != v2:
                    differences.append({
                        'Werkzeug': tool,
                        'Parameter': key,
                        label1: v1,
                        label2: v2
                    })

    if differences:
        with open(output_csv, 'w', newline='', encoding='utf-8') as csvfile:
            fieldnames = ['Werkzeug', 'Parameter', label1, label2]
            writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
            writer.writeheader()
            writer.writerows(differences)

        print(f'Vergleich abgeschlossen. {len(differences)} Unterschiede gefunden. Ergebnisse in \"{output_csv}\" gespeichert.')
    else:
        print(f'Keine Unterschiede gefunden zwischen {file1} und {file2}')

if __name__ == "__main__":
    process_csv_files()



Der Code funktioniert grundsätzlich!!! Aber es ist ein Fehler drin. Und zwar das mit dem M6 stimmt nicht. Es muss immer das Werkzeug welches vor dem M6 kommt als Spindelwerkzeug deklariert werden! Es muss aber nicht zwingend in der selben Zeile stehen. Man muss sich die T... Nummer merken und wenn dann ein M6 im Code kommt muss das gemerkte Werkzeug als Spindelwerkzeug gespeichert werden. DAs ist dann das aktuelle Werkzeug was in die CSV muss . Bitte den ganzen code ausgeben