TOPTORIALS OFFICE - Python Grundkurs
Script: 004_Dateien_nach_Typ_sortieren
Autor: Chris
YouTube: https://www.youtube.com/@TOPTORIALS-OFFICE
Webseite: https://www.toptorials.com
Version: 1.0
Letzte Aktualisierung: 2026-08-05

============================================================

1. Was macht dieses Script?
==========================

Dieses Script sortiert Dateien mit Python automatisch nach ihrer
Dateiendung in passende Unterordner.

Es gibt zwei Varianten:

01_Einfach
02_SendTo_Dateien_nach_Typ_sortieren

Die einfache Variante sortiert Dateien im aktuellen Ordner.
Das Python-Script und die zugehörige Starter-Batchdatei werden dazu
in den gewünschten Ordner kopiert und dort gestartet.

Die SendTo-Variante verarbeitet einen oder mehrere Ordner, die im
Windows-Explorer markiert und über "Senden an" übergeben werden.

In beiden Varianten werden bekannte Dateitypen in diese Unterordner
einsortiert:

01_Bilder
02_Videos
03_Dokumente
04_Tabellen
05_Archive

Unbekannte Dateitypen bleiben unverändert im Ausgangsordner liegen.

Es gibt absichtlich:

* keine Kategorie "Sonstige"
* keine automatische Umbenennung
* kein Überschreiben vorhandener Zieldateien
* keine Löschfunktion
* keine rekursive Verarbeitung von Unterordnern

Standardmäßig ist der sichere Testmodus aktiv. Er zeigt nur an, was
bei einer echten Ausführung passieren würde.

Im Testmodus werden:

* keine Dateien verschoben
* keine Zielordner erstellt
* keine vorhandenen Dateien verändert

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

============================================================

2. Voraussetzungen
===================

Benötigt werden:

* Windows 10 oder Windows 11
* eine installierte Python-Version
* der Python Launcher "py" oder alternativ der Befehl "python"

Zum Prüfen kann eine Eingabeaufforderung geöffnet werden.

Python Launcher prüfen:

py --version

Python direkt prüfen:

python --version

Die Python-Scripte verwenden ausschließlich Module aus der
Python-Standardbibliothek. Es müssen keine zusätzlichen Pakete mit
pip installiert werden.

Verwendete Module:

datetime
pathlib
shutil
subprocess
sys

Die Zwischenablage wird unter Windows über das Programm clip
angesprochen.

============================================================

3. Enthaltene Ordner und Dateien
================================

01_Einfach
004_dateien_nach_typ_sortieren.py
004_dateien_nach_typ_sortieren_starter_batch_test.bat

02_SendTo_Dateien_nach_Typ_sortieren
004_sendto_dateien_nach_typ_sortieren.py
004_sendto_dateien_nach_typ_sortieren_starter_batch_test.bat

Die Dateien mit der Endung .py enthalten die eigentliche
Python-Logik.

Die Dateien mit der Endung .bat starten die passenden Python-Scripte
und aktivieren abhängig vom eigenen Dateinamen den Testmodus.

============================================================

4. Sicherheitshinweis
=====================

Bitte die Scripte zuerst ausschließlich in einem Testordner mit
unwichtigen Testdateien ausprobieren.

Die mitgelieferten Starter-Batchdateien tragen am Ende ihres Namens:

_test.bat

Solange _test im Namen der Starter-Batchdatei steht, wird das
Python-Script mit folgendem Argument gestartet:

--test

In diesem Modus wird nur angezeigt, welche Dateien bei einer echten
Ausführung verschoben würden.

Erst wenn die Ausgabe vollständig geprüft wurde, kann _test aus dem
Namen der Starter-Batchdatei entfernt werden.

Beispiel einfache Variante:

Testmodus:
004_dateien_nach_typ_sortieren_starter_batch_test.bat

Echtmodus:
004_dateien_nach_typ_sortieren_starter_batch.bat

Beispiel SendTo-Variante:

Testmodus:
004_sendto_dateien_nach_typ_sortieren_starter_batch_test.bat

Echtmodus:
004_sendto_dateien_nach_typ_sortieren_starter_batch.bat

Im Echtmodus erscheint vor jedem zu bearbeitenden Ordner zusätzlich
eine Sicherheitsabfrage.

Zum Fortfahren muss eingegeben werden:

JA

Groß- und Kleinschreibung wird dabei ignoriert. Deshalb werden zum
Beispiel alle folgenden Eingaben akzeptiert:

JA
ja
Ja
jA

Jede andere Eingabe bricht die einfache Variante ab oder überspringt
in der SendTo-Variante den betreffenden Ordner.

Trotz der eingebauten Schutzmaßnahmen sollte vor der Verwendung mit
wichtigen Dateien immer eine aktuelle Datensicherung vorhanden sein.

============================================================

5. Kategorien und unterstützte Dateiendungen
=============================================

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

Groß- und Kleinschreibung spielt bei den Dateiendungen keine Rolle.

Beispiele:

foto.jpg
foto.JPG
foto.Jpg

Alle drei Dateien werden als Bild erkannt.

Die Kategorien können direkt im Python-Script erweitert oder
verändert werden.

Beispiel:

kategorien = {
    "01_Bilder": [".jpg", ".jpeg", ".png", ".gif", ".webp"],
}

Soll zusätzlich das Bildformat .bmp erkannt werden, kann die Zeile
so ergänzt werden:

kategorien = {
    "01_Bilder": [".jpg", ".jpeg", ".png", ".gif", ".webp", ".bmp"],
}

Jede Dateiendung beginnt mit einem Punkt und steht in
Anführungszeichen.

============================================================

6. Variante 1: 01_Einfach
=========================

Die einfache Variante befindet sich im Ordner:

01_Einfach

Darin liegen diese Dateien:

004_dateien_nach_typ_sortieren.py
004_dateien_nach_typ_sortieren_starter_batch_test.bat

Beide Dateien werden in den Ordner kopiert, dessen direkte Dateien
sortiert werden sollen.

Empfohlener erster Start:

004_dateien_nach_typ_sortieren_starter_batch_test.bat

Die Starter-Batchdatei kann per Doppelklick gestartet werden.

Das Script verarbeitet nur Dateien, die direkt im aktuellen Ordner
liegen. Bereits vorhandene Unterordner werden nicht durchsucht.

Beispiel vor dem Sortieren:

C:\Testordner\foto.jpg
C:\Testordner\film.mp4
C:\Testordner\rechnung.pdf
C:\Testordner\daten.xlsx
C:\Testordner\sicherung.zip
C:\Testordner\projekt.c4d

Beispiel nach der echten Ausführung:

C:\Testordner\01_Bilder\foto.jpg
C:\Testordner\02_Videos\film.mp4
C:\Testordner\03_Dokumente\rechnung.pdf
C:\Testordner\04_Tabellen\daten.xlsx
C:\Testordner\05_Archive\sicherung.zip
C:\Testordner\projekt.c4d

Die Datei projekt.c4d bleibt liegen, weil .c4d keiner Kategorie
zugeordnet ist.

Auch die Scriptdateien .py und .bat bleiben standardmäßig liegen,
weil diese Dateiendungen nicht in den Kategorien enthalten sind.

Wichtig:

Eine .txt-Datei gehört zur Kategorie 03_Dokumente und wird deshalb
bei der echten Ausführung verschoben.

============================================================

7. Variante 2: 02_SendTo_Dateien_nach_Typ_sortieren
==================================================

Die SendTo-Variante befindet sich im Ordner:

02_SendTo_Dateien_nach_Typ_sortieren

Darin liegen diese Dateien:

004_sendto_dateien_nach_typ_sortieren.py
004_sendto_dateien_nach_typ_sortieren_starter_batch_test.bat

Diese beiden Dateien können dauerhaft gemeinsam an einem festen Ort
gespeichert werden.

Im Windows-Explorer werden anschließend ein oder mehrere Ordner
markiert und über "Senden an" an die Starter-Batchdatei übergeben.

Typischer Ablauf:

1. Einen oder mehrere Ordner im Explorer markieren.
2. Mit der rechten Maustaste auf die Markierung klicken.
3. "Senden an" auswählen.
4. Die Verknüpfung zur SendTo-Starterdatei anklicken.
5. Die Ausgabe für jeden Ordner kontrollieren.
6. Im Testmodus werden keine Dateien verändert.

Die SendTo-Version verarbeitet ausschließlich Ordner.

Wird eine einzelne Datei oder ein nicht vorhandener Pfad übergeben,
erscheint eine Meldung und das Element wird übersprungen.

Bei mehreren übergebenen Ordnern werden die Ordner nacheinander
verarbeitet.

Im Echtmodus muss jeder Ordner einzeln bestätigt werden. Dadurch kann
ein Ordner verarbeitet und der nächste bei Bedarf übersprungen
werden.

============================================================

8. SendTo-Verknüpfung einrichten
================================

Damit die SendTo-Variante im Kontextmenü erscheint, wird eine
Verknüpfung zur Starter-Batchdatei im SendTo-Ordner von Windows
abgelegt.

Vorgehensweise:

1. Die beiden SendTo-Dateien gemeinsam an einem festen Ort speichern.
2. Eine Verknüpfung zu folgender Datei erstellen:

004_sendto_dateien_nach_typ_sortieren_starter_batch_test.bat

3. Windows-Taste + R drücken.
4. Folgenden Befehl eingeben:

shell:sendto

5. Enter drücken.
6. Die erstellte Verknüpfung in diesen Ordner verschieben.

Danach steht die Verknüpfung im Explorer unter "Senden an" zur
Verfügung.

Wichtig beim Wechsel in den Echtmodus:

Wenn _test aus dem Namen der echten Starter-Batchdatei entfernt
wurde, kann die vorhandene Verknüpfung ihr Ziel verlieren.

Dann muss entweder:

* das Ziel der Verknüpfung angepasst werden
* oder eine neue Verknüpfung erstellt werden

Die Python-Datei darf nicht umbenannt werden, weil ihr Name fest in
der Starter-Batchdatei eingetragen ist.

============================================================

9. Warum gibt es eine Starter-Batchdatei?
=========================================

Die Python-Logik steht in der .py-Datei.

Die Batchdatei übernimmt den kontrollierten Start.

Das hat mehrere Vorteile:

* die passende Python-Datei wird automatisch gefunden
* der Start ist per Doppelklick möglich
* der Arbeitsordner wird richtig gesetzt
* der Testmodus kann über den Dateinamen gesteuert werden
* Fehlermeldungen bleiben durch die abschließende Eingabe sichtbar
* SendTo kann mehrere Ordnerpfade an Python weitergeben
* der Aufbau bleibt über die Kursteile hinweg einheitlich

Die Starterdatei verwendet standardmäßig:

py

Falls der Python Launcher auf einem System nicht verfügbar ist, ist
eine Alternative mit folgendem Befehl vorbereitet:

python

Dann müssen die passenden py-Zeilen mit REM auskommentiert und die
vorbereiteten python-Zeilen aktiviert werden.

============================================================

10. Wie erkennt die Starterdatei den Testmodus?
===============================================

Die Starter-Batchdatei führt diese Suche aus:

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

%~n0 enthält den Namen der gestarteten Batchdatei ohne
Dateiendung.

find sucht darin nach:

_test

Der Parameter /i bedeutet, dass Groß- und Kleinschreibung bei der
Suche ignoriert wird.

Wurde _test gefunden, ist der Errorlevel kleiner als 1.

Dann wird das Python-Script mit folgendem Argument gestartet:

--test

Wurde _test nicht gefunden, startet die Batchdatei das Python-Script
ohne dieses Argument.

Dadurch muss der Python-Code für den Wechsel zwischen Test- und
Echtmodus nicht verändert werden.

============================================================

11. Besonderheit der SendTo-Starterdatei
========================================

Die SendTo-Starterdatei hängt an den Python-Aufruf zusätzlich an:

%*

%* enthält alle Argumente, die an die Batchdatei übergeben wurden.

Wenn im Explorer mehrere Ordner markiert werden, übergibt Windows
deren Pfade als einzelne Argumente.

Beispiel:

"C:\Test\Ordner 1"
"C:\Test\Ordner 2"

Die Anführungszeichen schützen Pfade mit Leerzeichen.

Python übernimmt diese Argumente über:

sys.argv

============================================================

12. Testmodus im Python-Script erkennen
=======================================

Die einfache Variante verwendet:

testmodus = "--test" in sys.argv

sys.argv enthält den Namen des gestarteten Python-Scripts und alle
zusätzlich übergebenen Argumente.

Ist --test enthalten, wird testmodus wahr.

Die SendTo-Variante verwendet zunächst:

argumente = sys.argv[1:]
testmodus = "--test" in argumente

Mit [1:] wird der erste Eintrag übersprungen. Dieser erste Eintrag
ist der Name des Python-Scripts.

Anschließend wird --test aus der Liste entfernt:

if testmodus:
    argumente.remove("--test")

Dadurch verbleiben in argumente nur noch die übergebenen Pfade.

============================================================

13. Den aktuellen Arbeitsordner bestimmen
=========================================

Die einfache Variante verwendet:

basis_ordner = Path.cwd()

Path.cwd() liefert den aktuellen Arbeitsordner.

cwd steht für:

current working directory

Die Starter-Batchdatei führt vorher aus:

cd /d "%~dp0"

Dadurch entspricht der aktuelle Arbeitsordner dem Ordner, in dem die
Starter-Batchdatei liegt.

Die SendTo-Variante erhält den Basisordner aus dem übergebenen Pfad:

basis_ordner = Path(element_pfad)

Nach der Prüfung wird daraus ein vollständiger Pfad gebildet:

basis_ordner = basis_ordner.resolve()

============================================================

14. Das Dictionary kategorien
==============================

Die Kategorien werden in einem Dictionary gespeichert:

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 verbindet Schlüssel mit Werten.

Der Schlüssel ist hier der Name des Zielordners.

Der Wert ist eine Liste mit den passenden Dateiendungen.

Beispiel:

Schlüssel:

01_Bilder

Werte:

.jpg
.jpeg
.png
.gif
.webp

Python-Dictionaries behalten in aktuellen Python-Versionen die
Reihenfolge bei, in der die Einträge angelegt wurden.

============================================================

15. Bekannte Erweiterungen sammeln
==================================

Zusätzlich wird eine gemeinsame Liste aller bekannten Endungen
erstellt:

bekannte_erweiterungen = []

for erweiterungen in kategorien.values():
    bekannte_erweiterungen.extend(erweiterungen)

kategorien.values() liefert die Erweiterungslisten aller Kategorien.

extend() hängt die einzelnen Erweiterungen an die gemeinsame Liste
an.

Diese Liste wird später verwendet, um unbekannte Dateitypen zu
erkennen.

============================================================

16. Dateien mit pathlib erfassen
================================

Die Dateien werden mit einer Schleife erfasst:

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.

append() fügt diese Datei der Liste dateien hinzu.

Unterordner werden nicht durchsucht, weil weder rglob() noch eine
rekursive Funktion verwendet wird.

============================================================

17. Passende Dateien auswählen
==============================

Die Kategorien werden nacheinander verarbeitet:

for kategorie, erweiterungen in kategorien.items():

items() liefert jeweils den Kategorienamen und die zugehörige Liste
von Dateiendungen.

Für jede Kategorie wird eine leere Liste vorbereitet:

passende_dateien = []

Die Prüfung lautet:

if datei.suffix.lower() in erweiterungen:
    passende_dateien.append(datei)

suffix liefert die Dateiendung einschließlich Punkt.

Beispiel:

.jpg

lower() wandelt die Endung in Kleinbuchstaben um. Dadurch werden auch
Endungen wie .JPG erkannt.

in prüft, ob die Endung in der aktuellen Erweiterungsliste enthalten
ist.

============================================================

18. Alle Zielordner im Echtmodus erstellen
==========================================

Für jede Kategorie wird der Zielordner gebildet:

ziel_ordner = basis_ordner / kategorie

Im Echtmodus wird anschließend immer versucht, diesen Ordner zu
erstellen:

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

Das gilt auch dann, wenn momentan keine passende Datei für diese
Kategorie vorhanden ist.

parents=True erlaubt bei Bedarf auch das Erstellen fehlender
übergeordneter Ordner.

exist_ok=True verhindert einen Fehler, wenn der Kategorienordner
bereits vorhanden ist.

Im Testmodus wird mkdir() nicht ausgeführt. Es werden deshalb keine
Ordner erstellt.

============================================================

19. Zielpfade mit pathlib bilden
================================

pathlib kann Pfadbestandteile mit dem Schrägstrich-Operator
verbinden.

Zielordner:

ziel_ordner = basis_ordner / kategorie

Vollständiger Zielpfad einer Datei:

ziel_datei = ziel_ordner / datei.name

Beispiel:

Basisordner:
C:\Test

Kategorie:
01_Bilder

Dateiname:
urlaub.jpg

Ergebnis:
C:\Test\01_Bilder\urlaub.jpg

============================================================

20. Vorhandene Zieldateien schützen
===================================

Vor dem Verschieben wird geprüft:

if ziel_datei.exists():

Existiert im Zielordner bereits eine Datei mit demselben Namen, wird
die Quelldatei übersprungen.

Im Testmodus erscheint:

WÜRDE ÜBERSPRINGEN

Im Echtmodus erscheint:

ÜBERSPRUNGEN

Die vorhandene Zieldatei wird nicht überschrieben.

Die Quelldatei wird nicht automatisch umbenannt.

Der Zähler wird erhöht mit:

anzahl_uebersprungen += 1

============================================================

21. Testmodus und Echtmodus
===========================

Im Testmodus wird keine Datei verschoben.

Stattdessen wird nur eine Meldung erzeugt:

WÜRDE VERSCHIEBEN

Der Zähler anzahl_verschoben beschreibt im Testmodus deshalb die
Anzahl der Dateien, die bei einer echten Ausführung verschoben
würden.

Im Echtmodus wird die Datei tatsächlich verschoben und die Meldung
lautet:

VERSCHOBEN

Die Sicherheitsabfrage verwendet:

antwort = input("Zum Fortfahren JA eingeben: ")

Die Prüfung lautet:

if antwort.upper() != "JA":

upper() wandelt die Eingabe für den Vergleich in Großbuchstaben um.
Deshalb wird die Schreibweise von ja nicht beachtet.

============================================================

22. Dateien mit shutil.move() verschieben
=========================================

Im Echtmodus wird eine passende Datei verschoben mit:

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

shutil.move() erhält den Quellpfad und den Zielpfad.

str() wandelt die Path-Objekte in Text um.

Nach einem erfolgreichen Aufruf wird eine Erfolgsmeldung in der
Konsole ausgegeben und dem Protokoll hinzugefügt.

Anschließend wird der Zähler erhöht:

anzahl_verschoben += 1

============================================================

23. Fehlerbehandlung mit try und except
=======================================

Fehleranfällige Aktionen stehen in try-Blöcken.

Beispiele:

* Ordner erstellen
* Ordner auslesen
* Dateien verschieben
* Logdatei schreiben
* Text in die Zwischenablage kopieren

Tritt ein passender Fehler auf, wird der except-Block ausgeführt.

Beispiel:

except OSError as fehler:

Die Variable fehler enthält Informationen zur Ursache.

Das Script gibt eine verständliche FEHLER-Meldung aus und erhöht bei
der Dateiverarbeitung den Fehlerzähler.

Ein Fehler beim Erstellen der optionalen Logdatei oder beim Kopieren
in die Zwischenablage wird angezeigt, aber nicht nachträglich in den
Zähler der Dateisortierung aufgenommen.

============================================================

24. Unbekannte Dateitypen überspringen
======================================

Nach den bekannten Kategorien werden alle erfassten Dateien noch
einmal geprüft.

Die Bedingung lautet:

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

Ist die Endung nicht bekannt, bleibt die Datei unverändert im
Basisordner liegen.

Das Script zeigt dafür eine Meldung an:

ÜBERSPRUNGEN: "projekt.c4d" - unbekannter Dateityp (.c4d)

Auch Dateien ohne Dateiendung werden erkannt und als unbekannter
Dateityp gemeldet.

Die Python- und Starter-Batchdateien der einfachen Variante gehören
ebenfalls zu den unbekannten Dateitypen und werden daher nicht
verschoben.

============================================================

25. Zähler und Zusammenfassung
==============================

Die Scripte verwenden drei Zähler:

anzahl_verschoben
anzahl_uebersprungen
anzahl_fehler

Im Testmodus bedeutet anzahl_verschoben:

Anzahl der Dateien, die verschoben würden.

Im Echtmodus bedeutet die Variable:

Anzahl der erfolgreich verschobenen Dateien.

anzahl_uebersprungen erfasst:

* bekannte Dateien mit einem Namenskonflikt im Ziel
* Dateien mit einer unbekannten Endung
* Dateien ohne Dateiendung

Bei der SendTo-Variante werden zusätzlich Gesamtzähler geführt:

gesamt_anzahl_verschoben
gesamt_anzahl_uebersprungen
gesamt_anzahl_fehler

Damit erscheint nach mehreren Ordnern eine gemeinsame
Gesamtübersicht.

============================================================

26. Das Protokoll
=================

Das Protokoll beginnt als leere Liste:

protokoll = []

Neue Meldungen werden angehängt mit:

protokoll.append(meldung)

Am Ende werden alle Einträge verbunden:

protokoll_text = "\n".join(protokoll)

join() verbindet die Listenelemente.

\n setzt zwischen den Einträgen einen Zeilenumbruch.

Die SendTo-Version verwendet zusätzlich:

gesamt_protokoll = []

Darin werden die Protokolle aller verarbeiteten Ordner gesammelt.

============================================================

27. Optionale Ausgabe aktivieren
================================

Standardmäßig ist nur die Bildschirmausgabe aktiv:

logdatei_erstellen = False
zwischenablage_verwenden = False

Für eine Logdatei:

logdatei_erstellen = True
zwischenablage_verwenden = False

Nur für die Zwischenablage:

logdatei_erstellen = False
zwischenablage_verwenden = True

Für Logdatei und Zwischenablage:

logdatei_erstellen = True
zwischenablage_verwenden = True

Im Script sind alle vier Varianten vorbereitet.

Wichtig:

Immer nur eine der vorbereiteten Varianten aktiv lassen. Die beiden
Variablen dürfen im tatsächlich ausgeführten Code nur einmal gesetzt
werden.

============================================================

28. Logdatei erstellen
======================

Der Dateiname enthält einen Zeitstempel:

zeitstempel = datetime.now().strftime("%Y-%m-%d_%H-%M-%S")

Daraus entsteht zum Beispiel:

sortierprotokoll_2026-08-05_14-30-25.log

Die Logdatei wird geschrieben mit:

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

Die einfache Variante speichert die Logdatei im aktuellen
Basisordner.

Die SendTo-Version erstellt für jeden bestätigten und verarbeiteten
Ordner eine eigene Logdatei in diesem Ordner.

Im Testmodus kann ebenfalls eine Logdatei erstellt werden, wenn die
Option aktiviert ist. Die Logdatei dokumentiert dann ausschließlich
die geplanten Aktionen. Die zu sortierenden Dateien und
Kategorieordner werden dabei nicht verändert.

============================================================

29. Zwischenablage verwenden
============================

Die Zwischenablage wird über subprocess und das Windows-Programm
clip verwendet.

Die einfache Variante übergibt ihr Protokoll an clip.

Die SendTo-Version sammelt zuerst alle Einzelprotokolle und kopiert
danach das Gesamtprotokoll.

Bei mehreren übergebenen Ordnern enthält die Zwischenablage dadurch
die Ergebnisse aller verarbeiteten Ordner sowie die Gesamtübersicht.

Die Zwischenablagefunktion ist für Windows vorgesehen.

============================================================

30. Typische Meldungen
======================

Testmodus:

WÜRDE VERSCHIEBEN:
Die Datei würde bei der echten Ausführung verschoben.

WÜRDE ÜBERSPRINGEN:
Im Zielordner existiert bereits eine gleichnamige Datei.

ÜBERSPRUNGEN - unbekannter Dateityp:
Die Datei bleibt unverändert im Ausgangsordner liegen.

Es wurden keine Dateien verschoben und keine Ordner erstellt:
Der Testmodus hat die Sortierstruktur nicht verändert.


Echtmodus:

VERSCHOBEN:
Die Datei wurde erfolgreich in den Kategorienordner verschoben.

ÜBERSPRUNGEN:
Die Datei wurde wegen eines Namenskonflikts oder unbekannten Typs
nicht verschoben.

FEHLER:
Eine Aktion konnte nicht erfolgreich abgeschlossen werden.

Abgebrochen:
Bei der einfachen Variante wurde die Sicherheitsabfrage nicht mit ja
bestätigt.

Dieser Ordner wurde nicht bearbeitet:
Bei der SendTo-Variante wurde die Verarbeitung dieses Ordners nicht
bestätigt.

============================================================

31. 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 vorbereiteten Alternativen
in der Starter-Batchdatei aktiviert werden.

Nach einer neuen Python-Installation sollte die Eingabeaufforderung
oder Windows neu gestartet werden, damit ein aktualisierter PATH
übernommen wird.


Python-Datei wurde nicht gefunden
---------------------------------

Die Python-Datei und ihre Starter-Batchdatei müssen im gleichen
Ordner liegen.

Die Dateinamen müssen exakt mit den Namen im Startercode
übereinstimmen.


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

Die SendTo-Version dieses Kursteils 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 und werden als
übersprungen gemeldet.


Eine Datei wurde wegen eines Namenskonflikts übersprungen
-----------------------------------------------------------

Im Zielordner existiert bereits eine Datei mit demselben Namen.

Die vorhandene Datei wird nicht überschrieben.

Die Quelldatei wird nicht automatisch umbenannt.


Alle Kategorieordner wurden erstellt
------------------------------------

Das ist in Version 1.0 vorgesehen.

Im Echtmodus werden immer alle fünf im Dictionary eingetragenen
Kategorieordner erstellt, auch wenn einzelne Kategorien leer bleiben.

Im Testmodus wird kein Kategorieordner erstellt.


Die Eingabe ja wurde akzeptiert
-------------------------------

Das ist ebenfalls vorgesehen.

Die Eingabe wird mit upper() in Großbuchstaben umgewandelt. Deshalb
werden ja, Ja, jA und JA gleichermaßen akzeptiert.


Keine Logdatei wurde erstellt
-----------------------------

Die Logausgabe ist standardmäßig ausgeschaltet.

Aktiviere eine vorbereitete Variante mit:

logdatei_erstellen = True


Die Zwischenablage funktioniert nicht
--------------------------------------

Die Zwischenablagefunktion verwendet das Windows-Programm clip.

Prüfe, ob das Script unter Windows ausgeführt wird und ob clip über
die Eingabeaufforderung erreichbar ist.


Umlaute oder Sonderzeichen werden falsch angezeigt
--------------------------------------------------

Die Starter-Batchdatei verwendet:

chcp 65001

Dadurch wird die Konsole auf UTF-8 eingestellt.

Das Script sollte über die mitgelieferte Starterdatei ausgeführt
werden.


Eine Datei konnte nicht verschoben werden
------------------------------------------

Mögliche Ursachen sind:

* fehlende Schreibrechte
* eine geöffnete oder gesperrte Datei
* ein nicht erreichbarer Ordner
* ein ungültiger Pfad
* ein schreibgeschützter Datenträger

Die genaue Ursache wird soweit möglich hinter "Grund:" angezeigt.

============================================================

32. Wichtige Python-Begriffe
============================

from ... import ...
Importiert einen bestimmten Bestandteil aus einem Modul.

import
Bindet ein Modul in das Python-Script ein.

Path
Erstellt und verarbeitet Pfade als Path-Objekte.

Path.cwd()
Liefert den aktuellen Arbeitsordner.

Path.resolve()
Ermittelt einen vollständigen absoluten Pfad.

Path.iterdir()
Liefert die direkten Inhalte eines Ordners.

Path.is_file()
Prüft, ob ein Pfad eine Datei bezeichnet.

Path.is_dir()
Prüft, ob ein Pfad einen Ordner bezeichnet.

Path.suffix
Liefert die letzte Dateiendung einschließlich Punkt.

Path.name
Liefert den Namen einer Datei oder eines Ordners.

Path.exists()
Prüft, ob ein Pfad existiert.

Path.mkdir()
Erstellt einen Ordner.

Path.write_text()
Schreibt Text in eine Datei.

datetime.now()
Liefert das aktuelle Datum und die aktuelle Uhrzeit.

strftime()
Formatiert Datum und Uhrzeit als Text.

shutil.move()
Verschiebt eine Datei oder einen Ordner.

subprocess.run()
Startet ein externes Programm, hier clip.

sys.argv
Enthält die beim Start übergebenen Argumente.

sys.exit()
Beendet das Python-Script.

input()
Wartet auf eine Eingabe.

print()
Gibt Text im Konsolenfenster aus.

Dictionary
Speichert Schlüssel zusammen mit den zugehörigen Werten.

Liste
Speichert mehrere Elemente in einer geordneten Sammlung.

items()
Liefert Schlüssel und Werte eines Dictionarys.

values()
Liefert die Werte eines Dictionarys.

append()
Hängt ein einzelnes Element an eine Liste an.

extend()
Hängt mehrere Elemente an eine Liste an.

lower()
Wandelt Text in Kleinbuchstaben um.

upper()
Wandelt Text in Großbuchstaben um.

in
Prüft, ob ein Wert in einer Sammlung enthalten ist.

not in
Prüft, ob ein Wert nicht in einer Sammlung enthalten ist.

for
Verarbeitet mehrere Elemente nacheinander.

if / else
Führt abhängig von einer Bedingung unterschiedliche Blöcke aus.

try / except
Fängt erwartbare Fehler ab und ermöglicht eine kontrollierte Meldung.

continue
Springt zum nächsten Durchlauf einer Schleife.

f-String
Setzt Variablen direkt in einen formatierten Text ein.

join()
Verbindet mehrere Textelemente zu einem Text.

============================================================

33. Wichtige Batch-Begriffe
===========================

@echo off
Blendet die ausgeführten Batchbefehle aus.

REM
Kennzeichnet eine Kommentarzeile.

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.

python
Alternativer Befehl zum Starten von Python.

%*
Enthält alle an die Batchdatei übergebenen Argumente.

============================================================

34. Was haben wir gelernt?
==========================

* Module mit import einbinden
* Path aus pathlib importieren
* den Arbeitsordner mit Path.cwd() ermitteln
* Startargumente mit sys.argv auslesen
* den Testmodus über --test steuern
* mehrere SendTo-Pfade in einer Liste entgegennehmen
* Ordner mit is_dir() prüfen
* vollständige Pfade mit resolve() bilden
* Kategorien in einem Dictionary speichern
* Dateiendungen mit suffix auslesen
* Dateiendungen mit lower() vergleichen
* Dateien mit iterdir() erfassen
* Pfade mit dem Schrägstrich-Operator zusammensetzen
* Ordner mit mkdir() erstellen
* Dateien mit shutil.move() verschieben
* vorhandene Zieldateien mit exists() schützen
* Fehler mit try und except behandeln
* unbekannte Dateitypen erkennen und überspringen
* Meldungen mit append() in einer Liste sammeln
* einen Protokolltext mit join() zusammensetzen
* einen Zeitstempel mit datetime und strftime() erzeugen
* eine Logdatei mit write_text() schreiben
* Text mit subprocess und clip in die Zwischenablage kopieren
* mehrere Ordner mit einer for-Schleife verarbeiten
* Einzelzähler und Gesamtzähler verwenden
* alle Batchargumente mit %* weitergeben

Nicht Bestandteil der Version 1.0 sind:

* rekursive Verarbeitung von Unterordnern
* eine Kategorie für unbekannte Dateitypen
* automatische Umbenennung bei Namenskonflikten
* Überschreiben vorhandener Zieldateien
* Zurücksetzen bereits verschobener Dateien
* Löschen von Dateien oder Ordnern
* externe Python-Pakete

============================================================

35. Kurzfassung
===============

Einfache Variante:

1. Beide Dateien aus 01_Einfach in einen Testordner kopieren.
2. Die Starter-Batchdatei mit _test im Namen starten.
3. Die angezeigten geplanten Aktionen prüfen.
4. Für die echte Ausführung _test aus dem Namen entfernen.
5. Die Starterdatei erneut ausführen.
6. Zum Bestätigen ja in beliebiger Groß-/Kleinschreibung eingeben.


SendTo-Variante:

1. Beide Dateien dauerhaft gemeinsam in einem Ordner speichern.
2. Eine Verknüpfung zur SendTo-_test.bat anlegen.
3. Die Verknüpfung in shell:sendto ablegen.
4. Einen oder mehrere Testordner im Explorer markieren.
5. Die Ordner über "Senden an" an das Script übergeben.
6. Die angezeigten geplanten Aktionen prüfen.
7. Für den Echtmodus _test aus dem Namen entfernen.
8. Die SendTo-Verknüpfung bei Bedarf aktualisieren.
9. Die Ordner erneut übergeben.
10. Jeden gewünschten Ordner einzeln mit ja bestätigen.

============================================================

TOPTORIALS OFFICE
Python Grundkurs
Teil 004 - Dateien nach Typ sortieren
Version 1.0
