Toptorials Tutorials WeblogoLogobild kleinLogobild kleinToptorials Tutorials Weblogo
  • ALLE THEMEN IM ÜBERBLICK
  • YouTube
  • INFOS
    • SITEMAP
    • ÜBER TOPTORIALS
✕
            No results See all results

            Python Grundkurs 004: Dateien automatisch nach Dateityp sortieren

            • Startseite
            • Tutorials Windows Automatisierung Python Grundkurs
            • Python Grundkurs 004: Dateien automatisch nach Dateityp sortieren

            Python Grundkurs 004: Dateien automatisch nach Dateityp sortieren

            Worum geht es in diesem Teil?

            In diesem vierten Teil des Python-Grundkurses sortieren wir Dateien automatisch nach ihrer Dateiendung in passende Unterordner.

            Aus Dateien wie:

            urlaub.jpg
            intro.mp4
            rechnung.pdf
            umsatz.xlsx
            projekt.zip

            entsteht zum Beispiel diese übersichtliche Ordnerstruktur:

            01_Bilder
            02_Videos
            03_Dokumente
            04_Tabellen
            05_Archive
            
            
            Vorher

            Vorher

            Python: Nachher

            Python: NachherDie Dateiendungen und Zielordner werden in einem Python-Dictionary festgelegt. Dadurch kann die Sortierung später leicht erweitert oder angepasst werden.

            Es gibt wieder zwei Varianten:

            01_Einfach
            02_SendTo_Dateien_nach_Typ_sortieren

            Die einfache Variante wird direkt in den Ordner kopiert, dessen Dateien sortiert werden sollen.

            Die zweite Variante ist eine SendTo-Version. Damit können ein oder mehrere Ordner im Windows-Explorer markiert und über Senden an an das Python-Skript übergeben werden.

            Was ist das Ziel?

            Das Ziel ist ein verständliches Python-Skript, das bekannte Dateitypen erkennt und die Dateien in vorbereitete Kategorien einsortiert.

            Dabei gelten wichtige Sicherheitsregeln:

            Zuerst wird nur getestet.
            Im Testmodus werden keine Dateien verschoben.
            Im Testmodus werden keine Ordner erstellt.
            Vorhandene Zieldateien werden nicht überschrieben.
            Unbekannte Dateitypen bleiben liegen.
            Dateien werden nicht automatisch umbenannt.
            Vor dem echten Sortieren muss JA eingegeben werden.

            Bei der Sicherheitsabfrage spielt die Groß- und Kleinschreibung keine Rolle. Damit werden zum Beispiel JA, Ja und ja akzeptiert.

            Im Echtmodus werden immer alle fünf Kategorieordner erstellt. Das gilt auch dann, wenn für eine Kategorie momentan keine passende Datei vorhanden ist.

            Das Skript kann die Meldungen außerdem wahlweise nur im Fenster anzeigen, als Logdatei speichern, in die Zwischenablage kopieren oder beide zusätzlichen Ausgaben verwenden.

            Warum ist dieser Teil wichtig?

            In diesem Teil lernen wir mehrere zentrale Python-Grundlagen kennen:

            Module importieren
            Startargumente mit sys.argv auslesen
            Variablen und Listen
            Python-Dictionaries
            for-Schleifen
            if-Abfragen
            Dateiendungen mit suffix auswerten
            Pfade mit pathlib zusammensetzen
            Dateien und Ordner prüfen
            Ordner mit mkdir() erstellen
            Dateien mit shutil.move() verschieben
            Fehler mit try und except behandeln
            Protokolle als Textdatei speichern
            Text in die Windows-Zwischenablage kopieren

            Besonders wichtig ist der Unterschied zwischen einem normalen Programmlauf und einem Testlauf. Das Skript zeigt im Testmodus möglichst genau, was bei der echten Ausführung passieren würde, verändert den Ordner aber nicht.

            Hinweis zur Kursreihe

            Diese Python-Reihe ist Teil einer größeren Windows-Automatisierungsreihe.

            Viele Aufgaben werden in mehreren Sprachen umgesetzt:

            Batch
            PowerShell 7
            Python

            Dadurch kann man gut vergleichen, wie dieselbe Aufgabe in unterschiedlichen Sprachen gelöst wird.

            Der Python-Code ist bewusst ausführlich aufgebaut. Funktionen oder Klassen wären möglich, würden diesen Grundkurs aber unnötig komplizierter machen. Deshalb verwenden wir gut sichtbare Variablen, Schleifen, Abfragen, Zähler und Meldungen.

            Downloads zu diesem Teil

            Für diesen Teil gibt es zwei Python-Skripte und die dazugehörigen Starter-Batchdateien.

            Dateien für Python Grundkurs Teil 004:


            Download Python Grundkurs: 004_Dateien_nach_Typ_sortieren als ZIP-Datei.

            Entpacken nach:

            C:\TOPTORIALS_CODE\020_Python_Grundkurs

            Falls der Ordner noch nicht existiert, lege ihn vorher im Explorer an.

            Nach dem Entpacken entsteht dort:

            C:\TOPTORIALS_CODE\020_Python_Grundkurs\004_Dateien_nach_Typ_sortieren

            Darin befinden sich diese beiden Unterordner:

            01_Einfach
            02_SendTo_Dateien_nach_Typ_sortieren

            Testumgebung zum Mitmachen

            Für diese Tutorialreihe gibt es zusätzlich eine vorbereitete Testumgebung.

            Die Testumgebung enthält vorbereitete Ordner und Beispieldateien, mit denen die Skripte gefahrlos ausprobiert werden können.

            Testumgebung für Windows-Automatisierung:

            Download TOPTORIALS_Testdaten_Windows_Automatisierung_V001.zip

            Entpacken nach:

            C:\TOPTORIALS_CODE\1000_TESTBEREICH

            Falls der Ordner C:\TOPTORIALS_CODE\1000_TESTBEREICH noch nicht existiert, lege ihn vorher im Explorer an.

            Für den Python-Grundkurs kann der entpackte Ordner zum Beispiel so benannt werden:

            TOPTORIALS_Testdaten_Windows_Automatisierung_Python_V001

            Ein möglicher Testpfad wäre dann:

            C:\TOPTORIALS_CODE\1000_TESTBEREICH\TOPTORIALS_Testdaten_Windows_Automatisierung_Python_V001\004_Dateien_nach_Typ_sortieren

            Sicherheitshinweis

            Wichtiger Hinweis:

            Die Skripte werden auf eigene Verantwortung verwendet. Teste sie zuerst in einer separaten Testumgebung und nicht direkt mit wichtigen Originaldateien.

            Solange _test im Namen der Starter-Batchdatei steht, wird das Python-Skript mit dem Startargument --test gestartet. In diesem Modus werden keine Dateien verschoben und keine Zielordner erstellt.

            Erst nachdem das Ergebnis geprüft wurde, kann _test aus dem Namen der Starter-Batchdatei entfernt werden. Beim echten Lauf erscheint zusätzlich eine Sicherheitsabfrage. Die Eingabe JA startet das Verschieben; Groß- und Kleinschreibung spielen dabei keine Rolle.

            Vorhandene Dateien im Zielordner werden nicht überschrieben. Trotzdem sollte die echte Ausführung zuerst mit Kopien unwichtiger Dateien getestet werden.

            Enthaltene Dateien

            Zu diesem Teil gehören zwei Varianten.

            Variante 1: Einfach

            01_Einfach
            ├── 004_dateien_nach_typ_sortieren.py
            └── 004_dateien_nach_typ_sortieren_starter_batch_test.bat

            Variante 2: SendTo-Dateien nach Typ sortieren

            02_SendTo_Dateien_nach_Typ_sortieren
            ├── 004_sendto_dateien_nach_typ_sortieren.py
            └── 004_sendto_dateien_nach_typ_sortieren_starter_batch_test.bat

            Variante 1: Dateien im aktuellen Ordner sortieren

            Die einfache Variante wird direkt in den Ordner kopiert, dessen Dateien sortiert werden sollen.

            Danach wird diese Datei per Doppelklick gestartet:

            004_dateien_nach_typ_sortieren_starter_batch_test.bat

            Solange _test im Dateinamen steht, läuft nur die Vorschau. Das Skript meldet dann zum Beispiel:

            WÜRDE VERSCHIEBEN: "urlaub.jpg" nach "C:\Test\01_Bilder\urlaub.jpg"
            ÜBERSPRUNGEN: "projekt.xyz" - unbekannter Dateityp (.xyz)

            Wenn alles richtig aussieht, wird ausschließlich _test aus dem Namen der Starter-Batchdatei entfernt:

            004_dateien_nach_typ_sortieren_starter_batch.bat

            Die Python-Datei selbst wird nicht umbenannt.

            Der komplette Code der einfachen Python-Datei

            Die Datei heißt:

            004_dateien_nach_typ_sortieren.py
            # ============================================================
            # TOPTORIALS OFFICE - Python Grundkurs
            # Script: 004_dateien_nach_typ_sortieren.py
            # Beschreibung: Sortiert Dateien nach Dateityp in Unterordner.
            # Autor: Chris
            # YouTube: https://www.youtube.com/@TOPTORIALS-OFFICE
            # Webseite: https://www.toptorials.com
            # Version: 1.0
            # Stand: 2026-08-05
            # ============================================================
            
            from datetime import datetime
            from pathlib import Path
            import shutil
            import subprocess
            import sys
            
            
            print()
            print("Dateien werden nach Typ sortiert...")
            print()
            
            basis_ordner = Path.cwd()
            testmodus = "--test" in sys.argv
            
            
            # ------------------------------------------------------------
            # Welche zusätzliche Ausgabe soll erstellt werden?
            # Wichtig: Immer nur EINE der folgenden Varianten aktiv lassen.
            # ------------------------------------------------------------
            
            # Variante 1: Nur Bildschirmausgabe
            logdatei_erstellen = False
            zwischenablage_verwenden = False
            
            # Variante 2: Logdatei erstellen
            # logdatei_erstellen = True
            # zwischenablage_verwenden = False
            
            # Variante 3: Nur in die Zwischenablage kopieren
            # logdatei_erstellen = False
            # zwischenablage_verwenden = True
            
            # Variante 4: Logdatei erstellen und in die Zwischenablage kopieren
            # logdatei_erstellen = True
            # zwischenablage_verwenden = True
            
            
            # ------------------------------------------------------------
            # Dateitypen und Zielordner festlegen
            # ------------------------------------------------------------
            
            kategorien = {
                "01_Bilder": [".jpg", ".jpeg", ".png", ".gif", ".webp"],
                "02_Videos": [".mp4", ".mov", ".mkv", ".avi"],
                "03_Dokumente": [".pdf", ".docx", ".txt"],
                "04_Tabellen": [".xlsx", ".xls", ".csv"],
                "05_Archive": [".zip", ".rar", ".7z"],
            }
            
            bekannte_erweiterungen = []
            
            for erweiterungen in kategorien.values():
                bekannte_erweiterungen.extend(erweiterungen)
            
            anzahl_verschoben = 0
            anzahl_uebersprungen = 0
            anzahl_fehler = 0
            protokoll = []
            
            if testmodus:
                modus_text = "TESTMODUS"
            else:
                modus_text = "ECHTMODUS"
            
            protokoll.append("Dateien werden nach Typ sortiert.")
            protokoll.append(f"Modus: {modus_text}")
            protokoll.append(f"Verarbeiteter Ordner: {basis_ordner}")
            protokoll.append("")
            
            print(f"Modus: {modus_text}")
            print(f"Verarbeiteter Ordner: {basis_ordner}")
            print()
            
            
            # ------------------------------------------------------------
            # Sicherheitsabfrage bei der echten Ausführung
            # ------------------------------------------------------------
            
            if not testmodus:
                print("ACHTUNG: Dieses Skript wird Dateien wirklich verschieben.")
                print()
            
                antwort = input("Zum Fortfahren JA eingeben: ")
            
                if antwort.upper() != "JA":
                    print()
                    print("Abgebrochen.")
                    print()
                    input("Drücke Enter zum Beenden")
                    sys.exit()
            
            
            # ------------------------------------------------------------
            # Dateien erfassen
            # Es werden nur Dateien direkt im Basisordner verarbeitet.
            # Unterordner werden nicht durchsucht.
            # ------------------------------------------------------------
            
            dateien = []
            
            for pfad in basis_ordner.iterdir():
                if pfad.is_file():
                    dateien.append(pfad)
            
            
            # ------------------------------------------------------------
            # Bekannte Dateitypen sortieren
            # ------------------------------------------------------------
            
            for kategorie, erweiterungen in kategorien.items():
                ziel_ordner = basis_ordner / kategorie
                passende_dateien = []
            
                for datei in dateien:
                    if datei.suffix.lower() in erweiterungen:
                        passende_dateien.append(datei)
            
                # Im Echtmodus werden alle Kategorieordner erstellt.
                # Das gilt auch dann, wenn momentan keine passende Datei vorhanden ist.
                if not testmodus:
                    try:
                        ziel_ordner.mkdir(parents=True, exist_ok=True)
                    except OSError as fehler:
                        if passende_dateien:
                            for datei in passende_dateien:
                                meldung = (
                                    f'FEHLER: "{datei.name}" konnte nicht verschoben werden. '
                                    f'Zielordner "{kategorie}" konnte nicht erstellt werden. '
                                    f"Grund: {fehler}"
                                )
                                print(meldung)
                                protokoll.append(meldung)
                                anzahl_fehler += 1
                        else:
                            meldung = (
                                f'FEHLER: Zielordner "{kategorie}" konnte nicht erstellt werden. '
                                f"Grund: {fehler}"
                            )
                            print(meldung)
                            protokoll.append(meldung)
                            anzahl_fehler += 1
            
                        continue
            
                for datei in passende_dateien:
                    ziel_datei = ziel_ordner / datei.name
            
                    if ziel_datei.exists():
                        if testmodus:
                            meldung = (
                                f'WÜRDE ÜBERSPRINGEN: "{datei.name}" - '
                                f'Zieldatei existiert bereits: "{ziel_datei}"'
                            )
                        else:
                            meldung = (
                                f'ÜBERSPRUNGEN: "{datei.name}" - '
                                f'Zieldatei existiert bereits: "{ziel_datei}"'
                            )
            
                        print(meldung)
                        protokoll.append(meldung)
                        anzahl_uebersprungen += 1
                        continue
            
                    if testmodus:
                        meldung = f'WÜRDE VERSCHIEBEN: "{datei.name}" nach "{ziel_datei}"'
                        print(meldung)
                        protokoll.append(meldung)
                        anzahl_verschoben += 1
                        continue
            
                    try:
                        shutil.move(str(datei), str(ziel_datei))
                        meldung = f'VERSCHOBEN: "{datei.name}" nach "{ziel_datei}"'
                        print(meldung)
                        protokoll.append(meldung)
                        anzahl_verschoben += 1
                    except OSError as fehler:
                        meldung = (
                            f'FEHLER: "{datei.name}" konnte nicht verschoben werden. '
                            f"Grund: {fehler}"
                        )
                        print(meldung)
                        protokoll.append(meldung)
                        anzahl_fehler += 1
            
            
            # ------------------------------------------------------------
            # Unbekannte Dateitypen überspringen
            # Diese Dateien bleiben unverändert im Basisordner liegen.
            # ------------------------------------------------------------
            
            for datei in dateien:
                if datei.suffix.lower() not in bekannte_erweiterungen:
                    if datei.suffix:
                        endung_text = datei.suffix
                    else:
                        endung_text = "keine Dateiendung"
            
                    meldung = (
                        f'ÜBERSPRUNGEN: "{datei.name}" - '
                        f"unbekannter Dateityp ({endung_text})"
                    )
                    print(meldung)
                    protokoll.append(meldung)
                    anzahl_uebersprungen += 1
            
            
            # ------------------------------------------------------------
            # Zusammenfassung
            # ------------------------------------------------------------
            
            protokoll.append("")
            protokoll.append("Fertig.")
            
            print()
            print("Fertig.")
            print()
            
            if testmodus:
                meldung_1 = f"Anzahl Dateien, die verschoben würden: {anzahl_verschoben}"
                meldung_2 = f"Anzahl übersprungen: {anzahl_uebersprungen}"
                meldung_3 = f"Anzahl Fehler: {anzahl_fehler}"
            
                print(meldung_1)
                print(meldung_2)
                print(meldung_3)
                print()
                print("Es wurden keine Dateien verschoben und keine Ordner erstellt.")
                print("Wenn alles richtig aussieht, entferne _test aus dem Namen der Starter-Batchdatei.")
            
                protokoll.append(meldung_1)
                protokoll.append(meldung_2)
                protokoll.append(meldung_3)
                protokoll.append("Es wurden keine Dateien verschoben und keine Ordner erstellt.")
            else:
                meldung_1 = f"Anzahl verschoben: {anzahl_verschoben}"
                meldung_2 = f"Anzahl übersprungen: {anzahl_uebersprungen}"
                meldung_3 = f"Anzahl Fehler: {anzahl_fehler}"
            
                print(meldung_1)
                print(meldung_2)
                print(meldung_3)
            
                protokoll.append(meldung_1)
                protokoll.append(meldung_2)
                protokoll.append(meldung_3)
            
            
            # ------------------------------------------------------------
            # Optionale Ausgabe als Logdatei und in die Zwischenablage
            # ------------------------------------------------------------
            
            protokoll_text = "\n".join(protokoll)
            zeitstempel = datetime.now().strftime("%Y-%m-%d_%H-%M-%S")
            logdatei = basis_ordner / f"sortierprotokoll_{zeitstempel}.log"
            
            if logdatei_erstellen:
                try:
                    logdatei.write_text(protokoll_text, encoding="utf-8")
                    print()
                    print("Das Protokoll wurde erstellt:")
                    print(logdatei)
                except OSError as fehler:
                    print()
                    print(f"FEHLER: Das Protokoll konnte nicht erstellt werden. Grund: {fehler}")
            
            if zwischenablage_verwenden:
                try:
                    subprocess.run(
                        "clip",
                        input=protokoll_text,
                        text=True,
                        encoding="utf-8",
                        check=True,
                    )
                    print()
                    print("Das Protokoll wurde zusätzlich in die Zwischenablage kopiert.")
                except (OSError, subprocess.CalledProcessError) as fehler:
                    print()
                    print(f"FEHLER: Das Protokoll konnte nicht kopiert werden. Grund: {fehler}")
            
            print()
            input("Drücke Enter zum Beenden")

            Code der einfachen Python-Datei erklärt

            Benötigte Module importieren

            from datetime import datetime
            from pathlib import Path
            import shutil
            import subprocess
            import sys

            datetime liefert Datum und Uhrzeit für den Namen der optionalen Logdatei.

            Path aus pathlib erleichtert die Arbeit mit Datei- und Ordnerpfaden.

            shutil wird zum Verschieben der Dateien verwendet. subprocess startet das Windows-Programm clip für die Zwischenablage. sys liefert die Startargumente und kann das Skript mit sys.exit() beenden.

            Arbeitsordner und Testmodus bestimmen

            basis_ordner = Path.cwd()
            testmodus = "--test" in sys.argv

            Path.cwd() liefert den aktuellen Arbeitsordner. Die Starter-Batchdatei wechselt vorher mit cd /d "%~dp0" in ihren eigenen Ordner.

            Mit "--test" in sys.argv wird geprüft, ob das Startargument --test vorhanden ist. Das Ergebnis ist entweder True oder False.

            Zusätzliche Ausgaben auswählen

            # Variante 1: Nur Bildschirmausgabe
            logdatei_erstellen = False
            zwischenablage_verwenden = False

            Die beiden booleschen Variablen steuern die optionalen Ausgaben. Im Skript sind vier fertige Kombinationen vorbereitet:

            Nur Bildschirmausgabe
            Bildschirmausgabe und Logdatei
            Bildschirmausgabe und Zwischenablage
            Bildschirmausgabe, Logdatei und Zwischenablage

            Immer nur eine der vier vorbereiteten Varianten sollte aktiv sein.

            Kategorien in einem Dictionary speichern

            kategorien = {
                "01_Bilder": [".jpg", ".jpeg", ".png", ".gif", ".webp"],
                "02_Videos": [".mp4", ".mov", ".mkv", ".avi"],
                "03_Dokumente": [".pdf", ".docx", ".txt"],
                "04_Tabellen": [".xlsx", ".xls", ".csv"],
                "05_Archive": [".zip", ".rar", ".7z"],
            }

            Ein Dictionary speichert zusammengehörige Schlüssel und Werte. Der Schlüssel ist hier der Name des Zielordners. Der Wert ist jeweils eine Liste mit den dazugehörigen Dateiendungen.

            Seit Python 3.7 bleibt die Einfügereihenfolge von Dictionaries garantiert erhalten. Die Kategorien werden daher in der eingetragenen Reihenfolge verarbeitet.

            Alle bekannten Erweiterungen sammeln

            bekannte_erweiterungen = []
            
            for erweiterungen in kategorien.values():
                bekannte_erweiterungen.extend(erweiterungen)

            kategorien.values() liefert alle Listen mit Dateiendungen. extend() hängt die enthaltenen Werte einzeln an die Liste bekannte_erweiterungen an. Diese Gesamtliste wird später benötigt, um unbekannte Dateitypen zu erkennen.

            Zähler und Protokoll vorbereiten

            anzahl_verschoben = 0
            anzahl_uebersprungen = 0
            anzahl_fehler = 0
            protokoll = []

            Die drei Zähler erfassen verschobene beziehungsweise im Testmodus vorgesehene, übersprungene und fehlerhafte Dateien. protokoll beginnt als leere Liste und sammelt die Meldungen des Skripts.

            Sicherheitsabfrage im Echtmodus

            if not testmodus:
                antwort = input("Zum Fortfahren JA eingeben: ")
            
                if antwort.upper() != "JA":
                    sys.exit()

            Die Sicherheitsabfrage wird nur ausgeführt, wenn der Testmodus nicht aktiv ist. upper() wandelt die Eingabe in Großbuchstaben um. Deshalb werden ja, Ja, jA und JA akzeptiert.

            Dateien im Basisordner erfassen

            dateien = []
            
            for pfad in basis_ordner.iterdir():
                if pfad.is_file():
                    dateien.append(pfad)

            iterdir() liefert die direkten Inhalte des Basisordners. is_file() prüft, ob das aktuelle Element eine Datei ist. Unterordner werden nicht durchsucht, weil kein rglob() verwendet wird.

            Dictionary mit items() durchlaufen

            for kategorie, erweiterungen in kategorien.items():

            items() liefert bei jedem Schleifendurchlauf den Kategorienamen und die zugehörige Liste der Dateiendungen. Beide Werte werden direkt in kategorie und erweiterungen gespeichert.

            Passende Dateien auswählen

            passende_dateien = []
            
            for datei in dateien:
                if datei.suffix.lower() in erweiterungen:
                    passende_dateien.append(datei)

            suffix liefert die Dateiendung einschließlich Punkt. lower() wandelt sie in Kleinbuchstaben um. Dadurch werden auch Endungen wie .JPG oder .Mp4 erkannt.

            Der Operator in prüft, ob die Endung in der Liste der aktuellen Kategorie vorkommt.

            Alle Kategorieordner im Echtmodus erstellen

            if not testmodus:
                ziel_ordner.mkdir(parents=True, exist_ok=True)

            mkdir() erstellt einen Ordner. parents=True erlaubt bei Bedarf auch das Erstellen fehlender übergeordneter Ordner. exist_ok=True verhindert einen Fehler, wenn der Zielordner bereits vorhanden ist.

            Dieser Block wird für jede Kategorie ausgeführt. Deshalb entstehen im Echtmodus immer alle fünf Kategorieordner, auch wenn in einer Kategorie gerade keine passende Datei vorhanden ist. Im Testmodus wird mkdir() überhaupt nicht ausgeführt.

            Zielpfad mit dem Schrägstrich-Operator bilden

            ziel_datei = ziel_ordner / datei.name

            Bei Path-Objekten verbindet der Operator / Pfadbestandteile. Aus dem Zielordner und dem Dateinamen entsteht der vollständige Zielpfad.

            Vorhandene Zieldateien schützen

            if ziel_datei.exists():
                anzahl_uebersprungen += 1
                continue

            exists() prüft, ob die Zieldatei bereits vorhanden ist. In diesem Fall wird sie nicht überschrieben. continue beendet nur den aktuellen Schleifendurchlauf und macht mit der nächsten Datei weiter.

            Testmodus und Echtmodus unterscheiden

            if testmodus:
                meldung = f'WÜRDE VERSCHIEBEN: "{datei.name}" nach "{ziel_datei}"'
                anzahl_verschoben += 1
                continue

            Im Testmodus wird lediglich eine Vorschau ausgegeben. shutil.move() wird durch continue nicht erreicht.

            Dateien mit shutil.move() verschieben

            shutil.move(str(datei), str(ziel_datei))

            shutil.move() verschiebt die Quelldatei zum Zielpfad. str() wandelt die Path-Objekte in Textpfade um.

            Fehler mit try und except behandeln

            try:
                shutil.move(str(datei), str(ziel_datei))
            except OSError as fehler:
                print(fehler)

            Tritt beim Erstellen eines Ordners, Lesen eines Ordners, Verschieben oder Schreiben ein Betriebssystemfehler auf, wird er als OSError abgefangen. Das Skript kann anschließend kontrolliert fortfahren und den Fehler ausgeben.

            Unbekannte Dateitypen erkennen

            if datei.suffix.lower() not in bekannte_erweiterungen:

            not in prüft, ob eine Dateiendung nicht in der Gesamtliste der bekannten Erweiterungen enthalten ist. Solche Dateien bleiben unverändert im Ausgangsordner und werden als übersprungen gezählt.

            Protokolltext zusammensetzen

            protokoll_text = "\n".join(protokoll)

            join() verbindet alle Listeneinträge. \n fügt zwischen den Meldungen jeweils einen Zeilenumbruch ein.

            Zeitstempel für die Logdatei erstellen

            zeitstempel = datetime.now().strftime("%Y-%m-%d_%H-%M-%S")
            logdatei = basis_ordner / f"sortierprotokoll_{zeitstempel}.log"

            datetime.now() liefert Datum und Uhrzeit. strftime() formatiert den Wert zu einem Dateinamen wie sortierprotokoll_2026-08-05_14-30-25.log.

            Logdatei mit write_text() schreiben

            logdatei.write_text(protokoll_text, encoding="utf-8")

            write_text() schreibt den gesamten Protokolltext in die Datei. encoding="utf-8" sorgt dafür, dass Umlaute und Sonderzeichen korrekt gespeichert werden.

            Text mit clip in die Zwischenablage kopieren

            subprocess.run(
                "clip",
                input=protokoll_text,
                text=True,
                encoding="utf-8",
                check=True,
            )

            subprocess.run() startet das Windows-Programm clip. Der Protokolltext wird über input an das Programm übergeben. check=True sorgt dafür, dass ein fehlgeschlagener Aufruf als Fehler behandelt werden kann.

            Starter-Batchdatei der einfachen Variante

            @echo off
            REM ============================================================
            REM TOPTORIALS OFFICE - Python Grundkurs
            REM Script: 004_dateien_nach_typ_sortieren_starter_batch_test.bat
            REM Beschreibung: Startet das Python-Skript im Testmodus.
            REM Autor: Chris
            REM YouTube: https://www.youtube.com/@TOPTORIALS-OFFICE
            REM Webseite: https://www.toptorials.com
            REM Version: 1.0
            REM Stand: 2026-08-05
            REM
            REM Hinweis:
            REM Solange _test im Dateinamen steht, wird --test uebergeben.
            REM Fuer die echte Ausfuehrung _test aus dem Dateinamen entfernen.
            REM ============================================================
            
            chcp 65001 >nul
            cd /d "%~dp0"
            
            echo %~n0 | find /i "_test" >nul
            
            if not errorlevel 1 (
                py "004_dateien_nach_typ_sortieren.py" --test
                REM Alternative, falls py nicht funktioniert:
                REM python "004_dateien_nach_typ_sortieren.py" --test
            ) else (
                py "004_dateien_nach_typ_sortieren.py"
                REM Alternative, falls py nicht funktioniert:
                REM python "004_dateien_nach_typ_sortieren.py"
            )

            Code der einfachen Starter-Batchdatei erklärt

            Konsole vorbereiten und Arbeitsordner wechseln

            @echo off
            chcp 65001 >nul
            cd /d "%~dp0"

            @echo off blendet die ausgeführten Batchbefehle aus. chcp 65001 stellt die Konsole auf UTF-8 um. %~dp0 enthält Laufwerk und Ordner der gestarteten Batchdatei; cd /d wechselt dorthin.

            Testmodus im Dateinamen erkennen

            echo %~n0 | find /i "_test" >nul

            %~n0 enthält den Namen der Batchdatei ohne Dateiendung. find /i sucht darin unabhängig von Groß- und Kleinschreibung nach _test.

            Python mit oder ohne –test starten

            if not errorlevel 1 (
                py "004_dateien_nach_typ_sortieren.py" --test
            ) else (
                py "004_dateien_nach_typ_sortieren.py"
            )

            Wurde _test gefunden, startet der Python Launcher py das Skript mit --test. Ohne _test fehlt dieses Argument und das Skript läuft im Echtmodus.

            Variante 2: Mehrere Ordner über SendTo sortieren

            Die SendTo-Variante bleibt dauerhaft gemeinsam mit ihrer Starter-Batchdatei in einem festen Ordner.

            Im Windows-Explorer können anschließend ein oder mehrere Ordner markiert und über Senden an an das Skript übergeben werden. Jeder gültige Ordner wird einzeln verarbeitet.

            Einzelne Dateien, ungültige Pfade und nicht erreichbare Ordner werden übersprungen. Im Echtmodus erscheint die Sicherheitsabfrage für jeden gültigen Ordner einzeln.

            Der komplette Code der SendTo-Python-Datei

            Die Datei heißt:

            004_sendto_dateien_nach_typ_sortieren.py
            # ============================================================
            # TOPTORIALS OFFICE - Python Grundkurs
            # Script: 004_sendto_dateien_nach_typ_sortieren.py
            # Beschreibung: Sortiert Dateien übergebener Ordner nach Dateityp in Unterordner.
            # Autor: Chris
            # YouTube: https://www.youtube.com/@TOPTORIALS-OFFICE
            # Webseite: https://www.toptorials.com
            # Version: 1.0
            # Stand: 2026-08-05
            # ============================================================
            
            from datetime import datetime
            from pathlib import Path
            import shutil
            import subprocess
            import sys
            
            
            print()
            
            argumente = sys.argv[1:]
            testmodus = "--test" in argumente
            
            if testmodus:
                argumente.remove("--test")
            
            
            # ------------------------------------------------------------
            # Prüfen, ob mindestens ein Element übergeben wurde
            # ------------------------------------------------------------
            
            if not argumente:
                print("Bitte sende mindestens einen Ordner an dieses Skript.")
                print()
                print("Du kannst einen Ordner im Explorer rechts anklicken")
                print("und anschließend 'Senden an' verwenden.")
                print()
                input("Drücke Enter zum Beenden")
                sys.exit()
            
            
            # ------------------------------------------------------------
            # Welche zusätzliche Ausgabe soll erstellt werden?
            # Wichtig: Immer nur EINE der folgenden Varianten aktiv lassen.
            # ------------------------------------------------------------
            
            # Variante 1: Nur Bildschirmausgabe
            logdatei_erstellen = False
            zwischenablage_verwenden = False
            
            # Variante 2: Logdatei erstellen
            # logdatei_erstellen = True
            # zwischenablage_verwenden = False
            
            # Variante 3: Nur in die Zwischenablage kopieren
            # logdatei_erstellen = False
            # zwischenablage_verwenden = True
            
            # Variante 4: Logdatei erstellen und in die Zwischenablage kopieren
            # logdatei_erstellen = True
            # zwischenablage_verwenden = True
            
            
            # ------------------------------------------------------------
            # Dateitypen und Zielordner festlegen
            # ------------------------------------------------------------
            
            kategorien = {
                "01_Bilder": [".jpg", ".jpeg", ".png", ".gif", ".webp"],
                "02_Videos": [".mp4", ".mov", ".mkv", ".avi"],
                "03_Dokumente": [".pdf", ".docx", ".txt"],
                "04_Tabellen": [".xlsx", ".xls", ".csv"],
                "05_Archive": [".zip", ".rar", ".7z"],
            }
            
            bekannte_erweiterungen = []
            
            for erweiterungen in kategorien.values():
                bekannte_erweiterungen.extend(erweiterungen)
            
            if testmodus:
                modus_text = "TESTMODUS"
            else:
                modus_text = "ECHTMODUS"
            
            gesamt_protokoll = []
            gesamt_anzahl_verschoben = 0
            gesamt_anzahl_uebersprungen = 0
            gesamt_anzahl_fehler = 0
            
            gesamt_protokoll.append("Dateien werden nach Typ sortiert.")
            gesamt_protokoll.append(f"Modus: {modus_text}")
            gesamt_protokoll.append("")
            
            
            # ------------------------------------------------------------
            # Alle übergebenen Elemente nacheinander verarbeiten
            # ------------------------------------------------------------
            
            for element_pfad in argumente:
                basis_ordner = Path(element_pfad)
            
                # Die SendTo-Variante verarbeitet ausschließlich Ordner.
                # Einzelne Dateien und nicht vorhandene Pfade werden übersprungen.
                if not basis_ordner.is_dir():
                    meldung = "ÜBERSPRUNGEN: Der übergebene Pfad ist kein Ordner"
            
                    print(meldung)
                    print(element_pfad)
                    print()
            
                    gesamt_protokoll.append(meldung)
                    gesamt_protokoll.append(f"Pfad: {element_pfad}")
                    gesamt_protokoll.append("")
                    gesamt_anzahl_uebersprungen += 1
                    continue
            
                basis_ordner = basis_ordner.resolve()
                anzahl_verschoben = 0
                anzahl_uebersprungen = 0
                anzahl_fehler = 0
                protokoll = []
            
                protokoll.append("Dateien werden nach Typ sortiert.")
                protokoll.append(f"Modus: {modus_text}")
                protokoll.append(f"Verarbeiteter Ordner: {basis_ordner}")
                protokoll.append("")
            
                print(f"Modus: {modus_text}")
                print(f"Verarbeiteter Ordner: {basis_ordner}")
                print()
            
            
                # --------------------------------------------------------
                # Sicherheitsabfrage bei der echten Ausführung
                # --------------------------------------------------------
            
                if not testmodus:
                    print("ACHTUNG: Dieses Skript wird Dateien in diesem Ordner wirklich verschieben.")
                    print()
            
                    antwort = input("Zum Fortfahren JA eingeben: ")
            
                    if antwort.upper() != "JA":
                        meldung = "ÜBERSPRUNGEN: Dieser Ordner wurde nicht bearbeitet."
            
                        print()
                        print(meldung)
                        print()
            
                        protokoll.append(meldung)
                        gesamt_protokoll.extend(protokoll)
                        gesamt_protokoll.append("")
                        gesamt_protokoll.append("============================================================")
                        gesamt_protokoll.append("")
                        continue
            
            
                # --------------------------------------------------------
                # Dateien erfassen
                # Es werden nur Dateien direkt im Basisordner verarbeitet.
                # Unterordner werden nicht durchsucht.
                # --------------------------------------------------------
            
                dateien = []
            
                try:
                    for pfad in basis_ordner.iterdir():
                        if pfad.is_file():
                            dateien.append(pfad)
                except OSError as fehler:
                    meldung = f'FEHLER: Der Ordner konnte nicht gelesen werden. Grund: {fehler}'
                    print(meldung)
                    protokoll.append(meldung)
                    anzahl_fehler += 1
            
            
                # --------------------------------------------------------
                # Bekannte Dateitypen sortieren
                # --------------------------------------------------------
            
                for kategorie, erweiterungen in kategorien.items():
                    ziel_ordner = basis_ordner / kategorie
                    passende_dateien = []
            
                    for datei in dateien:
                        if datei.suffix.lower() in erweiterungen:
                            passende_dateien.append(datei)
            
                    # Im Echtmodus werden alle Kategorieordner erstellt.
                    # Das gilt auch dann, wenn momentan keine passende Datei vorhanden ist.
                    if not testmodus:
                        try:
                            ziel_ordner.mkdir(parents=True, exist_ok=True)
                        except OSError as fehler:
                            if passende_dateien:
                                for datei in passende_dateien:
                                    meldung = (
                                        f'FEHLER: "{datei.name}" konnte nicht verschoben werden. '
                                        f'Zielordner "{kategorie}" konnte nicht erstellt werden. '
                                        f"Grund: {fehler}"
                                    )
                                    print(meldung)
                                    protokoll.append(meldung)
                                    anzahl_fehler += 1
                            else:
                                meldung = (
                                    f'FEHLER: Zielordner "{kategorie}" konnte nicht erstellt werden. '
                                    f"Grund: {fehler}"
                                )
                                print(meldung)
                                protokoll.append(meldung)
                                anzahl_fehler += 1
            
                            continue
            
                    for datei in passende_dateien:
                        ziel_datei = ziel_ordner / datei.name
            
                        if ziel_datei.exists():
                            if testmodus:
                                meldung = (
                                    f'WÜRDE ÜBERSPRINGEN: "{datei.name}" - '
                                    f'Zieldatei existiert bereits: "{ziel_datei}"'
                                )
                            else:
                                meldung = (
                                    f'ÜBERSPRUNGEN: "{datei.name}" - '
                                    f'Zieldatei existiert bereits: "{ziel_datei}"'
                                )
            
                            print(meldung)
                            protokoll.append(meldung)
                            anzahl_uebersprungen += 1
                            continue
            
                        if testmodus:
                            meldung = f'WÜRDE VERSCHIEBEN: "{datei.name}" nach "{ziel_datei}"'
                            print(meldung)
                            protokoll.append(meldung)
                            anzahl_verschoben += 1
                            continue
            
                        try:
                            shutil.move(str(datei), str(ziel_datei))
                            meldung = f'VERSCHOBEN: "{datei.name}" nach "{ziel_datei}"'
                            print(meldung)
                            protokoll.append(meldung)
                            anzahl_verschoben += 1
                        except OSError as fehler:
                            meldung = (
                                f'FEHLER: "{datei.name}" konnte nicht verschoben werden. '
                                f"Grund: {fehler}"
                            )
                            print(meldung)
                            protokoll.append(meldung)
                            anzahl_fehler += 1
            
            
                # --------------------------------------------------------
                # Unbekannte Dateitypen überspringen
                # Diese Dateien bleiben unverändert im Basisordner liegen.
                # --------------------------------------------------------
            
                for datei in dateien:
                    if datei.suffix.lower() not in bekannte_erweiterungen:
                        if datei.suffix:
                            endung_text = datei.suffix
                        else:
                            endung_text = "keine Dateiendung"
            
                        meldung = (
                            f'ÜBERSPRUNGEN: "{datei.name}" - '
                            f"unbekannter Dateityp ({endung_text})"
                        )
                        print(meldung)
                        protokoll.append(meldung)
                        anzahl_uebersprungen += 1
            
            
                # --------------------------------------------------------
                # Zusammenfassung für diesen Ordner
                # --------------------------------------------------------
            
                protokoll.append("")
                protokoll.append("Fertig.")
            
                print()
                print("Fertig.")
                print()
            
                if testmodus:
                    meldung_1 = f"Anzahl Dateien, die verschoben würden: {anzahl_verschoben}"
                    meldung_2 = f"Anzahl übersprungen: {anzahl_uebersprungen}"
                    meldung_3 = f"Anzahl Fehler: {anzahl_fehler}"
            
                    print(meldung_1)
                    print(meldung_2)
                    print(meldung_3)
                    print()
                    print("Es wurden keine Dateien verschoben und keine Ordner erstellt.")
            
                    protokoll.append(meldung_1)
                    protokoll.append(meldung_2)
                    protokoll.append(meldung_3)
                    protokoll.append("Es wurden keine Dateien verschoben und keine Ordner erstellt.")
                else:
                    meldung_1 = f"Anzahl verschoben: {anzahl_verschoben}"
                    meldung_2 = f"Anzahl übersprungen: {anzahl_uebersprungen}"
                    meldung_3 = f"Anzahl Fehler: {anzahl_fehler}"
            
                    print(meldung_1)
                    print(meldung_2)
                    print(meldung_3)
            
                    protokoll.append(meldung_1)
                    protokoll.append(meldung_2)
                    protokoll.append(meldung_3)
            
            
                # --------------------------------------------------------
                # Optionale Ausgabe als Logdatei
                # Für jeden verarbeiteten Ordner wird eine Datei erstellt.
                # --------------------------------------------------------
            
                protokoll_text = "\n".join(protokoll)
                zeitstempel = datetime.now().strftime("%Y-%m-%d_%H-%M-%S")
                logdatei = basis_ordner / f"sortierprotokoll_{zeitstempel}.log"
            
                if logdatei_erstellen:
                    try:
                        logdatei.write_text(protokoll_text, encoding="utf-8")
                        print()
                        print("Das Protokoll wurde erstellt:")
                        print(logdatei)
                    except OSError as fehler:
                        print()
                        print(f"FEHLER: Das Protokoll konnte nicht erstellt werden. Grund: {fehler}")
            
                gesamt_anzahl_verschoben += anzahl_verschoben
                gesamt_anzahl_uebersprungen += anzahl_uebersprungen
                gesamt_anzahl_fehler += anzahl_fehler
            
                gesamt_protokoll.extend(protokoll)
                gesamt_protokoll.append("")
                gesamt_protokoll.append("============================================================")
                gesamt_protokoll.append("")
            
                print()
                print("============================================================")
                print()
            
            
            # ------------------------------------------------------------
            # Gesamtübersicht und optionale Ausgabe in die Zwischenablage
            # ------------------------------------------------------------
            
            if testmodus:
                gesamt_meldung_1 = f"Insgesamt würden verschoben: {gesamt_anzahl_verschoben}"
            else:
                gesamt_meldung_1 = f"Insgesamt verschoben: {gesamt_anzahl_verschoben}"
            
            gesamt_meldung_2 = f"Insgesamt übersprungen: {gesamt_anzahl_uebersprungen}"
            gesamt_meldung_3 = f"Insgesamt Fehler: {gesamt_anzahl_fehler}"
            
            print("Gesamtübersicht:")
            print(gesamt_meldung_1)
            print(gesamt_meldung_2)
            print(gesamt_meldung_3)
            print()
            
            gesamt_protokoll.append("Gesamtübersicht:")
            gesamt_protokoll.append(gesamt_meldung_1)
            gesamt_protokoll.append(gesamt_meldung_2)
            gesamt_protokoll.append(gesamt_meldung_3)
            
            if zwischenablage_verwenden and gesamt_protokoll:
                gesamt_protokoll_text = "\n".join(gesamt_protokoll)
            
                try:
                    subprocess.run(
                        "clip",
                        input=gesamt_protokoll_text,
                        text=True,
                        encoding="utf-8",
                        check=True,
                    )
                    print("Alle Protokolle wurden zusätzlich in die Zwischenablage kopiert.")
                    print()
                except (OSError, subprocess.CalledProcessError) as fehler:
                    print(f"FEHLER: Die Protokolle konnten nicht kopiert werden. Grund: {fehler}")
                    print()
            
            if testmodus:
                print("Der Test ist abgeschlossen.")
                print("Es wurden keine Dateien verschoben und keine Ordner erstellt.")
                print("Wenn alles richtig aussieht, entferne _test aus dem Namen der Starter-Batchdatei.")
                print()
            
            input("Drücke Enter zum Beenden")

            Code der SendTo-Python-Datei erklärt

            Startargumente übernehmen

            argumente = sys.argv[1:]
            testmodus = "--test" in argumente
            
            if testmodus:
                argumente.remove("--test")

            sys.argv enthält alle Startargumente. Das Element mit dem Index 0 ist der Name des Python-Skripts. Der Slice [1:] übernimmt deshalb alle danach folgenden Argumente.

            Wenn --test vorhanden ist, wird es mit remove() aus der Liste entfernt. Danach enthält argumente nur noch die übergebenen Pfade.

            Fehlende Übergabe erkennen

            if not argumente:
                print("Bitte sende mindestens einen Ordner an dieses Skript.")
                sys.exit()

            Eine leere Liste gilt in einer Bedingung als falsch. if not argumente erkennt deshalb, ob die SendTo-Datei ohne übergebenen Ordner gestartet wurde.

            Alle übergebenen Elemente durchlaufen

            for element_pfad in argumente:
                basis_ordner = Path(element_pfad)

            Die for-Schleife verarbeitet jeden übergebenen Pfad nacheinander. Path() wandelt den Textpfad in ein Path-Objekt um.

            Ausschließlich Ordner zulassen

            if not basis_ordner.is_dir():
                gesamt_anzahl_uebersprungen += 1
                continue

            is_dir() prüft, ob der Pfad einen vorhandenen Ordner bezeichnet. Dateien und ungültige Pfade werden übersprungen.

            Vollständigen Ordnerpfad ermitteln

            basis_ordner = basis_ordner.resolve()

            resolve() erzeugt einen vollständigen, aufgelösten Pfad. Dieser wird für die Ausgabe und die weitere Verarbeitung verwendet.

            Sicherheitsabfrage für jeden Ordner

            Die Sicherheitsabfrage steht innerhalb der Schleife über alle Argumente. Deshalb wird im Echtmodus jeder gültige Ordner einzeln bestätigt. Wird nicht JA eingegeben, bleibt nur dieser Ordner unverändert; danach geht das Skript zum nächsten übergebenen Ordner weiter.

            Einzelprotokoll und Gesamtprotokoll

            protokoll = []
            gesamt_protokoll = []

            protokoll sammelt die Meldungen eines einzelnen Ordners. gesamt_protokoll sammelt anschließend die Ergebnisse aller verarbeiteten Ordner.

            Gesamtzähler bilden

            gesamt_anzahl_verschoben += anzahl_verschoben
            gesamt_anzahl_uebersprungen += anzahl_uebersprungen
            gesamt_anzahl_fehler += anzahl_fehler

            Nach jedem Ordner werden seine Zähler zu den Gesamtzählern addiert. Am Ende zeigt das Skript eine Gesamtübersicht über alle übergebenen Ordner.

            Eine Logdatei pro Ordner

            Wenn logdatei_erstellen aktiv ist, schreibt die SendTo-Version ihr jeweiliges Einzelprotokoll direkt in den verarbeiteten Ordner. Bei mehreren Ordnern entsteht damit pro Ordner eine eigene Logdatei.

            Alle Protokolle in die Zwischenablage kopieren

            Wenn zwischenablage_verwenden aktiv ist, verbindet die SendTo-Version am Ende das Gesamtprotokoll. Dadurch enthält die Zwischenablage die Ergebnisse aller in diesem Durchlauf übergebenen Ordner.

            Starter-Batchdatei der SendTo-Variante

            @echo off
            REM ============================================================
            REM TOPTORIALS OFFICE - Python Grundkurs
            REM Script: 004_sendto_dateien_nach_typ_sortieren_starter_batch_test.bat
            REM Beschreibung: Startet das Python-SendTo-Skript im Testmodus.
            REM Autor: Chris
            REM YouTube: https://www.youtube.com/@TOPTORIALS-OFFICE
            REM Webseite: https://www.toptorials.com
            REM Version: 1.0
            REM Stand: 2026-08-05
            REM
            REM Hinweis:
            REM Solange _test im Dateinamen steht, wird --test uebergeben.
            REM Fuer die echte Ausfuehrung _test aus dem Dateinamen entfernen.
            REM ============================================================
            
            chcp 65001 >nul
            cd /d "%~dp0"
            
            echo %~n0 | find /i "_test" >nul
            
            if not errorlevel 1 (
                py "004_sendto_dateien_nach_typ_sortieren.py" --test %*
                REM Alternative, falls py nicht funktioniert:
                REM python "004_sendto_dateien_nach_typ_sortieren.py" --test %*
            ) else (
                py "004_sendto_dateien_nach_typ_sortieren.py" %*
                REM Alternative, falls py nicht funktioniert:
                REM python "004_sendto_dateien_nach_typ_sortieren.py" %*
            )

            Code der SendTo-Starter-Batchdatei erklärt

            Die SendTo-Starterdatei funktioniert grundsätzlich wie die einfache Starterdatei. Der entscheidende Unterschied ist %*:

            py "004_sendto_dateien_nach_typ_sortieren.py" --test %*

            %* enthält alle Argumente, die Windows an die Batchdatei übergeben hat. Dadurch erhält Python alle im Explorer markierten Ordnerpfade.

            %* wird nicht zusätzlich als "%*" geschrieben. Andernfalls könnten mehrere getrennte Pfade zu einem einzigen Argument zusammengefasst werden.

            SendTo-Verknüpfung einrichten

            Den SendTo-Ordner von Windows öffnen:

            Windows-Taste + R
            shell:sendto
            Enter

            In diesem Ordner wird eine Verknüpfung zu folgender Datei angelegt:

            004_sendto_dateien_nach_typ_sortieren_starter_batch_test.bat

            Danach erscheint die Verknüpfung im Windows-Explorer unter:

            Rechtsklick auf einen oder mehrere Ordner
            Senden an

            Die Verknüpfung kann zum Beispiel Dateien nach Typ sortieren - TEST heißen.

            Wird _test später für den Echtmodus aus dem Namen der Starter-Batchdatei entfernt, muss die Verknüpfung gegebenenfalls aktualisiert oder neu erstellt werden.

            Kategorien und Dateiendungen erweitern

            Eine weitere Bildendung kann direkt an die vorhandene Liste angehängt werden:

            "01_Bilder": [".jpg", ".jpeg", ".png", ".gif", ".webp", ".bmp"],

            Eine weitere Kategorie wird als neuer Dictionary-Eintrag ergänzt:

            "06_Audio": [".mp3", ".wav", ".flac"],

            Im Echtmodus wird dann auch der Ordner 06_Audio immer erstellt.

            Typische Meldungen

            WÜRDE VERSCHIEBEN

            Die Datei würde bei der echten Ausführung verschoben. Im Testmodus wird der Ordner nicht verändert.

            WÜRDE ÜBERSPRINGEN

            Im Zielordner existiert bereits eine gleichnamige Datei. Auch im Echtmodus würde diese Datei nicht überschrieben.

            VERSCHOBEN

            Die Datei wurde im Echtmodus in den zugehörigen Kategorieordner verschoben.

            ÜBERSPRUNGEN

            Eine Datei besitzt einen unbekannten Dateityp, eine Zieldatei ist bereits vorhanden oder ein übergebener SendTo-Pfad ist kein gültiger Ordner.

            FEHLER

            Ein Ordner konnte nicht gelesen oder erstellt, eine Datei nicht verschoben, die Logdatei nicht geschrieben oder der Text nicht in die Zwischenablage kopiert werden.

            Typische Fehler und Lösungen

            Python wurde nicht gefunden

            Die Starterdateien verwenden standardmäßig py. Prüfe mit py --version, ob der Python Launcher verfügbar ist. Falls nur python funktioniert, können die bereits vorbereiteten Alternativzeilen in der Starter-Batchdatei verwendet werden.

            Die Python-Datei wurde nicht gefunden

            Die Python-Datei und ihre Starter-Batchdatei müssen gemeinsam im gleichen Ordner liegen. Die Dateinamen im Batchcode müssen exakt mit den tatsächlichen Dateinamen übereinstimmen.

            Die SendTo-Datei wurde direkt gestartet

            Beim Doppelklick wurden keine Ordnerpfade übergeben. Die SendTo-Variante sollte über Rechtsklick – Senden an gestartet werden.

            Eine einzelne Datei wurde übergeben

            Diese SendTo-Version verarbeitet ausschließlich Ordner. Einzelne Dateien werden als ungültige Eingabe übersprungen.

            Eine Datei wurde nicht sortiert

            Prüfe, ob ihre Dateiendung im Dictionary kategorien eingetragen ist. Unbekannte Dateitypen bleiben im Ausgangsordner liegen.

            Eine Datei wurde übersprungen

            Im Zielordner existiert bereits eine Datei mit demselben Namen. Die vorhandene Datei wird nicht überschrieben und die Quelldatei wird nicht automatisch umbenannt.

            Alle Kategorieordner wurden erstellt

            Das ist in dieser Version vorgesehen. Im Echtmodus werden alle im Dictionary eingetragenen Kategorieordner erstellt, auch wenn momentan keine passende Datei vorhanden ist.

            Die Eingabe ja wurde akzeptiert

            Auch das ist vorgesehen. Durch antwort.upper() spielt die Groß- und Kleinschreibung bei der Sicherheitsbestätigung keine Rolle.

            Keine Logdatei wurde erstellt

            Die Logausgabe ist standardmäßig ausgeschaltet. Aktiviere eine der vorbereiteten Varianten mit logdatei_erstellen = True.

            Die Zwischenablage funktioniert nicht

            Die Zwischenablage-Funktion verwendet das Windows-Programm clip. Sie ist daher für die Ausführung unter Windows vorgesehen.

            Umlaute oder Sonderzeichen werden falsch angezeigt

            Die Starter-Batchdatei stellt die Konsole mit chcp 65001 auf UTF-8 um. Prüfe außerdem, ob die Dateien als UTF-8 gespeichert wurden.

            Nützliche Python-Begriffe aus diesem Teil

            datetime
            Liefert Datum und Uhrzeit.
            
            Path
            Erstellt und verarbeitet Datei- und Ordnerpfade.
            
            Path.cwd()
            Liefert den aktuellen Arbeitsordner.
            
            Path()
            Wandelt einen Textpfad in ein Path-Objekt um.
            
            iterdir()
            Liest die direkten Inhalte eines Ordners aus.
            
            is_file()
            Prüft, ob ein Pfad eine Datei bezeichnet.
            
            is_dir()
            Prüft, ob ein Pfad einen Ordner bezeichnet.
            
            suffix
            Liefert die Dateiendung einschließlich Punkt.
            
            name
            Liefert den Datei- oder Ordnernamen.
            
            resolve()
            Ermittelt einen vollständigen, aufgelösten Pfad.
            
            exists()
            Prüft, ob ein Pfad existiert.
            
            mkdir()
            Erstellt einen Ordner.
            
            write_text()
            Schreibt Text in eine Datei.
            
            shutil.move()
            Verschiebt eine Datei oder einen Ordner.
            
            subprocess.run()
            Startet ein externes Programm.
            
            sys.argv
            Enthält den Skriptnamen und die Startargumente.
            
            sys.exit()
            Beendet das Python-Skript.
            
            Dictionary
            Speichert Schlüssel und zugehörige Werte.
            
            Liste
            Speichert mehrere Werte in einer Reihenfolge.
            
            items()
            Liefert Schlüssel und Werte eines Dictionaries.
            
            values()
            Liefert die Werte eines Dictionaries.
            
            append()
            Hängt einen einzelnen Wert an eine Liste an.
            
            extend()
            Hängt mehrere Werte einzeln an eine Liste an.
            
            remove()
            Entfernt einen bestimmten Wert aus einer Liste.
            
            lower()
            Wandelt Text in Kleinbuchstaben um.
            
            upper()
            Wandelt Text in Großbuchstaben um.
            
            join()
            Verbindet mehrere Textelemente.
            
            in
            Prüft, ob ein Wert in einer Sammlung enthalten ist.
            
            not in
            Prüft, ob ein Wert nicht in einer Sammlung enthalten ist.
            
            try / except
            Fängt erwartbare Fehler kontrolliert ab.
            
            OSError
            Fehlerklasse für viele Datei-, Ordner- und Betriebssystemfehler.
            
            continue
            Springt zum nächsten Durchlauf einer Schleife.
            
            True / False
            Boolesche Wahrheitswerte.
            
            f-String
            Setzt Variablen direkt in Text ein.

            Wichtige Batch-Begriffe aus diesem Teil

            @echo off
            Blendet die ausgeführten Batchbefehle aus.
            
            chcp 65001
            Stellt die Konsole auf UTF-8 um.
            
            >nul
            Unterdrückt eine Befehlsausgabe.
            
            cd /d
            Wechselt Ordner und bei Bedarf Laufwerk.
            
            %~dp0
            Laufwerk und Ordner der gestarteten Batchdatei.
            
            %~n0
            Name der gestarteten Batchdatei ohne Dateiendung.
            
            find /i
            Sucht unabhängig von Groß- und Kleinschreibung.
            
            errorlevel
            Enthält den Rückgabestatus des vorherigen Befehls.
            
            py
            Startet Python über den Python Launcher.
            
            %*
            Enthält alle an die Batchdatei übergebenen Argumente.

            Was haben wir gelernt?

            Startargumente mit sys.argv auslesen
            den Testmodus mit --test steuern
            den aktuellen Arbeitsordner mit Path.cwd() ermitteln
            mehrere SendTo-Ordner nacheinander verarbeiten
            Kategorien in einem Dictionary speichern
            Listen mit append() und extend() füllen
            Dateien mit iterdir() erfassen
            Dateiendungen mit suffix auslesen
            Groß- und Kleinschreibung mit lower() und upper() vereinheitlichen
            Pfade mit dem /-Operator zusammensetzen
            Dateien und Ordner prüfen
            alle Kategorieordner im Echtmodus mit mkdir() erstellen
            Dateien mit shutil.move() verschieben
            vorhandene Zieldateien schützen
            Fehler mit try und except behandeln
            Meldungen in Listen sammeln
            Protokolle mit join() zusammensetzen
            Logdateien mit write_text() schreiben
            Text mit clip in die Zwischenablage kopieren
            mehrere Batchargumente mit %* weitergeben

            Video zu diesem Tutorial:

             

            Das könnte Dich auch interessieren

            Keine Einträge gefunden

            Schreibe einen Kommentar Antwort abbrechen

            Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

            INTERESSANTE SEITEN

            • TUTORIALS SCHNELLER FINDEN
            • SCHNELLER RECHNEN LERNEN
            • MATHE AUFGABEN GENERATOR
            • LINIEN UND KARO GENERATOR
            • VORLAGEN ZUM AUSDRUCKEN
            • BINGO-SCHEIN-GENERATOR
            • MEINE WUNSCHLISTE
            • Symbole zum Kopieren

            Content

            • Microsoft Excel Tutorials
            • Microsoft Excel VBA Tutorials
            • Microsoft Word Tutorials
            • Microsoft Powerpoint Tutorials
            • Microsoft Windows 10 Tutorials
            • Google Tabellen Tutorials
            • Google Tabellen Script Tutorials
            • Google Docs Tutorials
            • LibreOffice Calc Tutorials
            • Libre Office Writer Tutorials
            • LibreOffice Impress Tutorials
            • OpenOffice Calc Tutorials
            • OpenOffice Writer Tutorials
            • OpenOffice Impress Tutorials
            • WPS Spreadsheets Tutorials
            • WPS Spreadsheets Tutorials

            Neue Beiträge

            • Python Grundkurs 004: Dateien automatisch nach Dateityp sortieren
            • PowerShell 7 Grundkurs 004: Dateien automatisch nach Dateityp sortieren
            • Batch Grundkurs 004: Dateien nach Dateityp automatisch sortieren
            • Python Grundkurs 003: Dateiliste erstellen
            • PowerShell 7 Grundkurs 003: Dateiliste erstellen

            Neue Kommentare

            • Chris zu Python in LibreOffice Calc: Formular auslesen und auswerten
            • Detlef M. zu Python in LibreOffice Calc: Formular auslesen und auswerten
            • Johannes Hanel zu Verknüpfungen in LibreOffice Calc
            • Holfrie zu Symbole vergrößern von der Benutzeroberfläche (OpenOffice)
            • Bianca zu Tutorial Wunsch Liste
            • Wolfgang Dehmer zu Funktion zeitlich gesteuert ausführen (Google Tabellen) Script

            Schlagwörter-Wolke

            anfänger Anleitung anpassen ausrechnen auswahlliste Bedingte Formatierung berechnen Calc Datum Download Dropdownliste einfügen entfernen erstellen Excel FreeOffice Funktion google hinzufügen Jahresplan Kalender Lernvideo LibreOffice löschen Makro markieren Microsoft OpenOffice PlanMaker programmierung script spreadsheets Sverweis Tabelle tabellen Tutorial VBA Video Wenn Wenn Funktion Word wps spreadsheets Zeilen Zelle Zellen
            KONTAKT   IMPRESSUM    DATENSCHUTZERKLÄRUNG    HAFTUNGSAUSSCHLUSS (Disclaimer)   © copyright TOPTORIALS