@greetings1: Hör doch mal bitte mit diesen völlig sinnlosen Typannotationen auf. Und ich meine hier nicht mal generell Typannotationen sondern das die, die Du da machst selbst wenn man Typannotationen ganz toll findet, völlig unnötiger Quatsch sind. Wenn man einem Namen eine Liste oder eine ganze Zahl zuweist, macht es genau überhaupt gar keinen Sinn da zusätzlich noch ``list`` und ``int`` als Annotation dran zu schreiben. Weder der menschliche Leser noch eine statische Typprüfung braucht das. Beide sehen und verstehen welchen Typ der literale Wert hat, der dort zugewiesen wird.
`time` wird importiert aber nirgends verwendet.
`mylist`, `e`, `fname`, und `new_fname` sind keine guten Namen. `my` ist überflüssig und nichtssagend, Grunddatentypen haben in Namen nichts zu suchen, und man sollte keine kryptischen Abkürzungen verwenden. Namen sollen dem Leser verraten was der Wert dahinter bedeutet, nicht zum rätselraten zwingen. Was soll das `f` in `fname` bedeuten? „File“? Dir ist klar das nichts in dem Code verhindert, dass da auch Verzeichnisnamen dran gebunden werden‽
In neuem Code sollte man `pathlib` verwenden.
Für das `i` gibt es `enumerate()`, das zählt man nicht manuell hoch.
Wenn in einer literalen Zeichenkette Backslashes vorkommen, dann sollte man die entweder „escapen“ oder ein ”rohes” Zeichenkettenliteral verwenden, statt darauf zu setzen, dass die Backslashes schon nicht mit Zeichen kombiniert werden die zu einer besonderen Bedeutung führen.
`re.match()` verankert das Muster bereits am Anfang der Zeichenkette, das "^" ist also überflüssig.
Ich würde das so schreiben, dass man für den Slice keine magische 4 in den Quelltext schreiben muss, sondern das von der Match-Länge abhängig machen.
Das zusammenbasteln des neuen Namens mittels ``+`` ist deutlich unübersichtlicher als ein f-Zeichenkettenliteral.
Zwischenstand (ungetestet):
Code: Alles auswählen
#!/usr/bin/env python3
import re
from datetime import datetime as DateTime
from pathlib import Path
def main():
base_path = Path(input("Verzeichnispfad: "))
old_and_new_path_pairs = []
for i, path in enumerate(
sorted(
base_path.iterdir(),
key=lambda path: path.stat().st_mtime,
),
1,
):
print(path)
new_name = path.name
match = re.match(r"\d{3}_", new_name)
if match:
new_name = new_name[match.end() :]
timestamp = DateTime.fromtimestamp(path.stat().st_mtime)
new_name = f"{i:03}_{timestamp:%Y-%m-%d_%H_%M_%S.%f}_{new_name}"
print(new_name)
old_and_new_path_pairs.append((path, path.with_name(new_name)))
for old_path, new_path in old_and_new_path_pairs:
print(f"{old_path!r} -> {new_path!r}")
# old_path.rename(new_path)
if __name__ == "__main__":
main()
Das doppelte Abfragen des Zeitstempels von der Datei könnte man sich noch sparen (ungetestet):
Code: Alles auswählen
#!/usr/bin/env python3
import re
from datetime import datetime as DateTime
from pathlib import Path
def main():
base_path = Path(input("Verzeichnispfad: "))
old_and_new_path_pairs = []
for i, (timestamp, path) in enumerate(
sorted(
(DateTime.fromtimestamp(path.stat().st_mtime), path)
for path in base_path.iterdir()
),
1,
):
print(path)
new_name = path.name
match = re.match(r"\d{3}_", new_name)
if match:
new_name = new_name[match.end() :]
new_name = f"{i:03}_{timestamp:%Y-%m-%d_%H_%M_%S.%f}_{new_name}"
print(new_name)
old_and_new_path_pairs.append((path, path.with_name(new_name)))
for old_path, new_path in old_and_new_path_pairs:
print(f"{old_path!r} -> {new_path!r}")
# old_path.rename(new_path)
if __name__ == "__main__":
main()