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

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

1. Was machen diese Scripte?
============================

Diese Scripte fügen mit Python einen Zeitstempel am Anfang von
Dateinamen ein und können diesen später wieder entfernen.

Beispiel vor dem Hinzufügen:

Rechnung.pdf

Beispiel nach dem Hinzufügen:

2026-08-27_14-35-42_Rechnung.pdf

Das verwendete Format lautet:

JJJJ-MM-TT_HH-MM-SS_Dateiname.ext

Durch die Reihenfolge Jahr, Monat, Tag, Stunde, Minute und Sekunde
lassen sich die Dateinamen auch alphabetisch chronologisch
sortieren.

Es gibt vier Varianten:

01_Zeitstempel_im_Dateinamen
02_Zeitstempel_aus_Dateinamen_entfernen
03_SendTo_Zeitstempel_im_Dateinamen
04_SendTo_Zeitstempel_aus_Dateinamen_entfernen

Die ersten beiden Varianten verarbeiten Dateien im aktuellen
Ordner der Starter-Batchdatei.

Die beiden SendTo-Varianten erhalten einzelne Dateien oder Ordner
über das Windows-Menü "Senden an".

Bei übergebenen Ordnern werden nur die direkt enthaltenen Dateien
verarbeitet. Tiefere Unterordner werden nicht durchsucht.

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

Im Testmodus werden:

* keine Dateien umbenannt
* keine Ordner umbenannt
* keine vorhandenen Elemente verändert

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

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

Benötigt werden:

* Windows 10 oder Windows 11
* eine installierte Python-Version
* der Python Launcher "py" oder alternativ der Befehl "python"
* Schreibberechtigung für die zu bearbeitenden Dateien und Ordner

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
re
subprocess
sys

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

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

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

007_Zeitstempel_im_Dateinamen

01_Zeitstempel_im_Dateinamen
007_zeitstempel_im_dateinamen.py
007_zeitstempel_im_dateinamen_starter_batch_test.bat

02_Zeitstempel_aus_Dateinamen_entfernen
007_zeitstempel_aus_dateinamen_entfernen.py
007_zeitstempel_aus_dateinamen_entfernen_starter_batch_test.bat

03_SendTo_Zeitstempel_im_Dateinamen
007_sendto_zeitstempel_im_dateinamen.py
007_sendto_zeitstempel_im_dateinamen_starter_batch_test.bat

04_SendTo_Zeitstempel_aus_Dateinamen_entfernen
007_sendto_zeitstempel_aus_dateinamen_entfernen.py
007_sendto_zeitstempel_aus_dateinamen_entfernen_starter_batch_test.bat

README.txt

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.

Der vorgesehene Kursordner lautet:

C:\TOPTORIALS_CODE\020_Python_Grundkurs\007_Zeitstempel_im_Dateinamen

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

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

Bitte die Scripte zuerst ausschließlich mit unwichtigen Testdateien
und Testordnern 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 umbenannt würden.

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

Beispiel:

Testmodus:
007_zeitstempel_im_dateinamen_starter_batch_test.bat

Echtmodus:
007_zeitstempel_im_dateinamen_starter_batch.bat

Wichtig:

Nur der Name der Starter-Batchdatei wird geändert. Der Name der
Python-Datei bleibt unverändert.

Im Echtmodus erscheint zusätzlich eine Sicherheitsabfrage.

Zum Fortfahren muss eingegeben werden:

JA

Die Eingabe wird mit upper() in Großbuchstaben umgewandelt. Deshalb
werden beispielsweise auch diese Eingaben akzeptiert:

ja
Ja
jA

Zusätzliche Leerzeichen werden nicht automatisch entfernt.

Jede andere Eingabe bricht die Ausführung ab.

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

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

5. Wie wird der Zeitstempel erzeugt?
====================================

Der Zeitstempel wird einmal pro Scriptdurchlauf erzeugt.

Die entscheidende Python-Zeile lautet:

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

datetime.now() ermittelt das aktuelle lokale Datum und die aktuelle
lokale Uhrzeit.

strftime() wandelt diese Werte anhand eines Formattextes in eine
Zeichenkette um.

Die Platzhalter bedeuten:

%Y = vierstelliges Jahr
%m = zweistelliger Monat
%d = zweistelliger Tag
%H = Stunde im 24-Stunden-Format
%M = Minute
%S = Sekunde

Beispiel:

2026-08-27_14-35-42

Der neue Dateiname wird aus dem Zeitstempel, einem Unterstrich und
dem bisherigen vollständigen Dateinamen gebildet:

neuer_name = zeitstempel + "_" + datei.name

Alle Dateien desselben Durchlaufs erhalten denselben Zeitstempel.

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

6. Wie wird ein Zeitstempel erkannt?
====================================

Die Scripte verwenden ein reguläres Ausdrucksmuster.

Bei den Erstellen-Varianten lautet es:

r"^\d{4}-\d{2}-\d{2}_\d{2}-\d{2}-\d{2}_"

Das Zeichen ^ bedeutet, dass der Treffer am Anfang des Dateinamens
beginnen muss.

\d steht für eine Ziffer.

Die Zahlen in geschweiften Klammern bestimmen, wie viele Ziffern
erwartet werden.

Ein ähnlicher Text in der Mitte des Dateinamens wird deshalb nicht
als zu entfernender Zeitstempel behandelt.

Die Entfernen-Varianten verwenden am Ende:

_?

Das Fragezeichen macht den letzten Unterstrich optional. Dadurch
kann ein passender Zeitstempel auch dann entfernt werden, wenn nach
den Sekunden kein Unterstrich steht.

Das Muster wird mit re.compile() einmal vorbereitet und anschließend
mit match() beziehungsweise sub() verwendet.

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

7. Variante 1: Zeitstempel im aktuellen Ordner hinzufügen
==========================================================

Diese Variante befindet sich im Ordner:

01_Zeitstempel_im_Dateinamen

Darin liegen diese Dateien:

007_zeitstempel_im_dateinamen.py
007_zeitstempel_im_dateinamen_starter_batch_test.bat

Beide Dateien werden gemeinsam in den Ordner kopiert, dessen Dateien
einen Zeitstempel erhalten sollen.

Die Starter-Batchdatei wechselt mit %~dp0 in ihren eigenen Ordner.
Python ermittelt diesen anschließend mit:

basis_ordner = Path.cwd()

Das Script erfasst nur die direkt enthaltenen Dateien.
Unterordner und deren Inhalte bleiben unverändert.

Bereits passend gestempelte Dateien werden übersprungen.

Empfohlener erster Start:

007_zeitstempel_im_dateinamen_starter_batch_test.bat

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

8. Variante 2: Zeitstempel im aktuellen Ordner entfernen
=========================================================

Diese Variante befindet sich im Ordner:

02_Zeitstempel_aus_Dateinamen_entfernen

Darin liegen diese Dateien:

007_zeitstempel_aus_dateinamen_entfernen.py
007_zeitstempel_aus_dateinamen_entfernen_starter_batch_test.bat

Auch diese beiden Dateien werden gemeinsam in den zu bearbeitenden
Ordner kopiert.

Beispiel vor dem Entfernen:

2026-08-27_14-35-42_Rechnung.pdf

Beispiel danach:

Rechnung.pdf

Das Script entfernt nur einen passenden Zeitstempel am Anfang des
Dateinamens.

Dateien ohne passenden Zeitstempel werden übersprungen.

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

9. Variante 3: Zeitstempel über SendTo hinzufügen
==================================================

Diese Variante befindet sich im Ordner:

03_SendTo_Zeitstempel_im_Dateinamen

Darin liegen diese Dateien:

007_sendto_zeitstempel_im_dateinamen.py
007_sendto_zeitstempel_im_dateinamen_starter_batch_test.bat

Diese Variante erhält einzelne Dateien oder Ordner über das
Windows-Menü "Senden an".

Bei einem übergebenen Ordner werden nur die direkt darin enthaltenen
Dateien verarbeitet.

Es können einzelne oder mehrere Dateien und Ordner gemeinsam
übergeben werden.

Doppelt erfasste Dateien werden mit einem Set erkannt und nur einmal
verarbeitet.

Eine Laufwerkswurzel wie C:\ wird aus Sicherheitsgründen nicht als
Ordner verarbeitet.

Alle Dateien desselben SendTo-Durchlaufs erhalten denselben
Zeitstempel.

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

10. Variante 4: Zeitstempel über SendTo entfernen
==================================================

Diese Variante befindet sich im Ordner:

04_SendTo_Zeitstempel_aus_Dateinamen_entfernen

Darin liegen diese Dateien:

007_sendto_zeitstempel_aus_dateinamen_entfernen.py
007_sendto_zeitstempel_aus_dateinamen_entfernen_starter_batch_test.bat

Diese Variante entfernt passende Zeitstempel aus übergebenen
Einzeldateien und aus den direkt enthaltenen Dateien übergebener
Ordner.

Auch hier werden doppelte Pfade und doppelt erfasste Dateien nur
einmal berücksichtigt.

Bei Namenskonflikten sucht das Script automatisch einen freien
Zielnamen mit einer dreistelligen Nummer.

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

11. SendTo-Verknüpfungen einrichten
===================================

Für jede SendTo-Variante wird eine eigene Verknüpfung zur passenden
Starter-Batchdatei im SendTo-Ordner von Windows angelegt.

Den SendTo-Ordner öffnen:

1. Windows-Taste und R drücken
2. shell:sendto eingeben
3. Enter drücken

In diesem Ordner werden Verknüpfungen zu diesen Dateien angelegt:

007_sendto_zeitstempel_im_dateinamen_starter_batch_test.bat
007_sendto_zeitstempel_aus_dateinamen_entfernen_starter_batch_test.bat

Die Verknüpfungen können verständliche Namen erhalten, zum Beispiel:

TEST - Python 007 - Zeitstempel hinzufügen
TEST - Python 007 - Zeitstempel entfernen

Danach erscheinen sie im Windows-Explorer unter:

Rechtsklick auf markierte Dateien oder Ordner
Senden an

Wichtig:

Die Verknüpfungen können umbenannt werden. Für den Testmodus ist der
Name der tatsächlichen Starter-Batchdatei entscheidend.

Python-Script und Starter-Batchdatei sollten an ihrem festen
Speicherort zusammenbleiben.

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

12. Schutz vor Namenskonflikten
===============================

Die Erstellen-Varianten prüfen, ob der geplante Zielpfad bereits
existiert. Ist das Ziel vorhanden, wird die Datei übersprungen und
nicht überschrieben.

Die Entfernen-Varianten verwenden die Funktion:

get_freier_zielname()

Existiert der ursprüngliche Name bereits, wird automatisch ein
nummerierter Zielname gesucht.

Beispiel:

Rechnung.pdf
Rechnung_001.pdf
Rechnung_002.pdf

Die Nummer wird immer dreistellig formatiert:

001
002
003

Das Set reservierte_ziele berücksichtigt zusätzlich Zielpfade, die
im aktuellen Durchlauf bereits geplant wurden, aber noch nicht im
Dateisystem existieren.

Die Vergleichspfade werden mit casefold() für einen Vergleich ohne
Beachtung der Groß- und Kleinschreibung vorbereitet.

Die tatsächliche Schreibweise der gespeicherten Dateinamen wird
dabei nicht verändert.

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

13. Welche Dateien werden ausgeschlossen?
===========================================

Folgende Dateiendungen werden absichtlich nicht verarbeitet:

.bat
.cmd
.ps1
.py
.log

Dadurch werden unter anderem die Python-Scripte, die
Starter-Batchdateien und erzeugte Protokolle nicht selbst
umbenannt.

Die Prüfung erfolgt mit:

datei.suffix.casefold()

Groß- und Kleinschreibung spielen bei der Dateiendung deshalb keine
Rolle.

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

14. Wie funktionieren die Umbenennungspläne?
=============================================

Die Scripte benennen Dateien nicht sofort während der ersten Prüfung
um.

Zuerst werden alle gültigen Umbenennungen in der Liste plaene
gesammelt.

Jeder Plan ist ein Dictionary mit Informationen wie:

quelle
alter_name
neuer_name
ziel

Erst nachdem sämtliche Dateien geprüft wurden, folgt eine zweite
Schleife.

Im Testmodus zeigt diese Schleife die Pläne nur an.

Im Echtmodus führt sie die Umbenennungen nach der zusätzlichen
Bestätigung mit rename() aus.

Dadurch bleibt die Prüfung klar vom tatsächlichen Verändern der
Dateien getrennt.

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

15. Zusätzliche Ausgabe einstellen
===================================

Alle vier Python-Scripte bieten vier Ausgabemöglichkeiten:

Variante 1:
Nur Bildschirmausgabe

Variante 2:
Bildschirmausgabe und Logdatei

Variante 3:
Bildschirmausgabe und Zwischenablage

Variante 4:
Bildschirmausgabe, Logdatei und Zwischenablage

Standardmäßig ist Variante 1 aktiv:

logdatei_erstellen = False
zwischenablage_verwenden = False

Wichtig:

Immer nur eine der vorbereiteten Kombinationen aktiv lassen.

Die normalen Varianten speichern eine aktivierte Logdatei im
aktuellen Arbeitsordner.

Die SendTo-Varianten speichern sie im Ordner des jeweiligen
Python-Scripts.

Beispiele für Logdateinamen:

umbenennprotokoll_zeitstempel_setzen_2026-08-27_14-35-42.log
umbenennprotokoll_zeitstempel_entfernen_2026-08-27_14-35-42.log
umbenennprotokoll_sendto_zeitstempel_setzen_2026-08-27_14-35-42.log
umbenennprotokoll_sendto_zeitstempel_entfernen_2026-08-27_14-35-42.log

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

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

16. Typische Bildschirmausgaben
===============================

WÜRDE UMBENENNEN:

Die Datei wurde erfolgreich geprüft. Im Testmodus werden Quelle und
geplantes Ziel angezeigt, ohne die Datei zu verändern.

UMBENANNT:

Die Datei wurde im bestätigten Echtmodus erfolgreich umbenannt.

ÜBERSPRUNGEN - Zeitstempel ist bereits vorhanden:

Die Erstellen-Variante hat am Anfang bereits einen passenden
Zeitstempel erkannt.

ÜBERSPRUNGEN - Kein Zeitstempel am Anfang gefunden:

Die Entfernen-Variante hat keinen passenden Zeitstempel am Anfang
des Dateinamens gefunden.

ÜBERSPRUNGEN - Dateiendung ist ausgeschlossen:

Die Datei besitzt eine der ausgeschlossenen Dateiendungen.

FEHLER:

Die Datei oder der Ordner konnte nicht gelesen beziehungsweise
umbenannt werden. Die genauere Meldung des abgefangenen OSError wird
zusätzlich angezeigt.

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

17. Warum gibt es Starter-Batchdateien?
=======================================

Die Starter-Batchdateien sorgen für einen bequemen Start per
Doppelklick und übernehmen mehrere Aufgaben.

chcp 65001

aktiviert die UTF-8-Codepage für Umlaute und Sonderzeichen.

%~dp0

liefert Laufwerk und Ordner der Starter-Batchdatei.

%~n0

liefert ihren eigenen Dateinamen ohne Dateiendung.

find /i "_test"

prüft ohne Beachtung der Groß- und Kleinschreibung, ob _test im
Dateinamen vorkommt.

Ist _test vorhanden, wird --test an Python übergeben.

Bei den SendTo-Starterdateien übergibt:

%*

zusätzlich sämtliche von Windows erhaltenen Datei- und Ordnerpfade
an das Python-Script.

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

18. Wichtige Python-Befehle und Begriffe
========================================

datetime.now()
Ermittelt das aktuelle lokale Datum und die aktuelle lokale Uhrzeit.

strftime()
Formatiert Datum und Uhrzeit als Zeichenkette.

re.compile()
Erstellt ein wiederverwendbares reguläres Ausdrucksmuster.

match()
Prüft den Anfang eines Textes auf das Regex-Muster.

sub()
Ersetzt einen erkannten Text. In diesem Teil wird damit der erste
Zeitstempel entfernt.

Path.cwd()
Liefert den aktuellen Arbeitsordner als Path-Objekt.

iterdir()
Liefert die direkt enthaltenen Elemente eines Ordners.

is_file() und is_dir()
Unterscheiden Dateien und Ordner.

stem
Liefert den Dateinamen ohne die letzte Dateiendung.

suffix
Liefert die letzte Dateiendung einschließlich Punkt.

exists()
Prüft, ob ein Pfad bereits vorhanden ist.

rename()
Benennt eine Datei um beziehungsweise verschiebt sie zum Zielpfad.

casefold()
Bereitet Text für einen Vergleich ohne Beachtung der Groß- und
Kleinschreibung vor.

set()
Erstellt eine Sammlung eindeutiger Werte.

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

try und except OSError
Fangen typische Datei- und Ordnerfehler kontrolliert ab.

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

19. Empfohlener Testablauf
==========================

1. Einen neuen Ordner mit mehreren unwichtigen Testdateien anlegen.

2. Einige Dateien mit und einige ohne passenden Zeitstempel
   vorbereiten.

3. Für die normale Variante Python-Script und Starter-Batchdatei
   gemeinsam in den Testordner kopieren.

4. Für die SendTo-Varianten die Verknüpfungen im SendTo-Ordner
   einrichten.

5. Die jeweilige Starter-Batchdatei zunächst mit _test im Namen
   verwenden.

6. Alle Meldungen mit WÜRDE UMBENENNEN sorgfältig prüfen.

7. Kontrollieren, ob ausgeschlossene Dateien und tiefere
   Unterordner unverändert bleiben.

8. Beim Entfernen vorhandene Zielnamen testen und die automatische
   Ergänzung _001, _002 und so weiter prüfen.

9. Erst danach _test aus dem Namen der tatsächlichen
   Starter-Batchdatei entfernen.

10. Die echte Ausführung erneut mit unwichtigen Testdaten testen.

11. Vor der späteren Verwendung mit wichtigen Daten eine aktuelle
    Datensicherung erstellen.

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

20. Wichtige Grenzen dieser Version
===================================

Diese Version arbeitet bewusst nach klaren und vorhersehbaren
Regeln.

* Unterordner werden nicht rekursiv durchsucht.
* Ordner selbst werden nicht umbenannt.
* Zeitstempel werden nur am Anfang des Dateinamens erkannt.
* Das erwartete Format ist JJJJ-MM-TT_HH-MM-SS.
* Die Dateiendungen .bat, .cmd, .ps1, .py und .log sind
  ausgeschlossen.
* Die Erstellen-Varianten überspringen bereits vorhandene Ziele.
* Die Entfernen-Varianten erzeugen bei Konflikten nummerierte Namen.
* Die Scripte prüfen nur das Textmuster. Sie kontrollieren nicht, ob
  jede erkannte Monats-, Tages- oder Uhrzeitangabe kalendarisch
  gültig ist.
* Es gibt keine automatische Rückgängig-Funktion.

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

21. Typische Fehler und Lösungen
================================

Python oder py wurde nicht gefunden:

Mit py --version und python --version prüfen, welcher Startbefehl
verfügbar ist. In den Batchdateien ist die Alternative mit python
bereits als Kommentar vorbereitet.

Das Python-Script wurde nicht gefunden:

Prüfen, ob Python-Script und Starter-Batchdatei gemeinsam im gleichen
Ordner liegen und ihre ursprünglichen Namen besitzen.

Eine Datei wird nicht verarbeitet:

Die Bildschirmausgabe prüfen. Mögliche Gründe sind eine
ausgeschlossene Dateiendung, ein bereits vorhandener Zeitstempel,
ein fehlender Zeitstempel oder ein vorhandener Zielname.

Dateien in Unterordnern werden nicht verarbeitet:

Das ist beabsichtigt. Die Scripte arbeiten nicht rekursiv.

Eine Datei kann nicht umbenannt werden:

Die Datei könnte geöffnet, schreibgeschützt oder durch fehlende
Zugriffsrechte geschützt sein. Die ausgegebene OSError-Meldung
enthält weitere Informationen.

Die Zwischenablage funktioniert nicht:

Die Zwischenablagefunktion verwendet das Windows-Programm clip.
Das Script muss deshalb unter Windows ausgeführt werden.

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

22. Haftungsausschluss
======================

Die Scripte wurden sorgfältig erstellt und verfügen über einen
Testmodus, eine zusätzliche Sicherheitsabfrage und verschiedene
Prüfungen.

Trotzdem kann keine Garantie dafür übernommen werden, dass sie in
jeder Umgebung und mit jeder Datei fehlerfrei funktionieren.

Die Nutzung erfolgt auf eigene Verantwortung.

Vor der Verarbeitung wichtiger Dateien sollte immer eine aktuelle
Datensicherung erstellt und der Ablauf zuerst mit Kopien getestet
werden.

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

23. Kurzfassung
===============

Zeitstempel hinzufügen:

1. Passende Variante auswählen.
2. Zuerst die Starter-Batchdatei mit _test verwenden.
3. Alle geplanten Namen kontrollieren.
4. Für den Echtmodus _test nur aus dem Namen der Starter-Batchdatei
   entfernen.
5. Mit JA bestätigen.

Zeitstempel entfernen:

1. Passende Entfernen-Variante auswählen.
2. Zuerst im Testmodus prüfen.
3. Automatisch erzeugte Konfliktnamen wie _001 kontrollieren.
4. Erst danach den Echtmodus starten und mit JA bestätigen.

SendTo verwenden:

1. shell:sendto öffnen.
2. Verknüpfung zur passenden Starter-Batchdatei anlegen.
3. Dateien oder Ordner im Explorer markieren.
4. Rechtsklick und "Senden an" auswählen.
5. Zuerst immer die Testvariante verwenden.

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

24. Weitere Informationen
==========================

YouTube:
https://www.youtube.com/@TOPTORIALS-OFFICE

Webseite:
https://www.toptorials.com

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

Viel Spaß beim Ausprobieren!

Euer Chris
