@mcdaniels: `chdir()` sollte man nicht verwenden. Das ändert einen prozessweiten Zustand und es skaliert nicht. Wenn man das in grösseren Programmen an mehreren Stellen versucht, kommt es früher oder später dazu, dass Funktionen auf effektiven Pfaden ausgeführt werden, mit denen man so nicht gerechnet hat. Die Funktion gibt das Verzeichnis zurück, aber damit wird beim Aufrufer gar nichts gemacht. Statt des `chdir()` sollte man den Rückgabewert auch tatsächlich verwenden um den Pfad zusammenzusetzen mit dem das Programm dann irgend etwas tut.
Wenn etwas am Anfang oder am Ende *aller* möglichen ``if``/``elif``/``else``-Zweige steht, kann man es auch *einmal* vor beziehungsweise nach diesem Konstrukt ausführen. Das betrifft in der `get_dir()` das ``break``. Anstelle des einen ``break`` nach der Abfrage, könnte man auch gleich das ``return`` dort ausführen lassen. Und wenn man den Pfad zurück gibt und nicht `chdir()` verwendet, dann braucht man die Sonderbehandlung der leeren Zeichenkette auch nicht.
`print()` ist eine Funktion wie jede andere, also sollte man da kein Leerzeichen setzen was man bei anderen Funktionsaufrufen auch nicht setzt. (Okay, bei `input()` machst Du das anscheinend auch — warum?)
In der `main()` wird `directory` gar nicht verwendet. Sollte es aber wie gesagt, statt `chdir()`.
`files` ist ein unpassender Name, da würde man Dateiobjekte (*mehrzahl*!) erwarten, aber keine Zeichenkette mit einem Glob-Muster. Ähnliches gilt für `filelist`. Das sind Datei*namen* und keine Dateien. Ausserdem sollte man konkrete Datentypen in Namen vermeiden, da man die öfter man im Laufe der Entwicklung durch andere Datentypen austauscht, und dann sind entweder die Namen irreführend oder man muss sie überall ändert. Beides begünstigt Fehler.
Auch `elemente` ist ein schlechter Name. Zum einen stimmt hier der Plural wieder nicht, denn es sind nicht mehrere Elemente der Liste die an diesen Namen gebunden werden, sondern immer nur *einer*. Und das jeweilige Element kann man sicher besser benennen als so generisch. Die Schleife geht über eine Liste mit Dateinamen, also ist ein Element ein Dateiname.
`index` wird viel zu weit vor der Schleife initialisiert. Wenn man den Quelltext liest, und an die Stelle kommt, wo es dann endlich benutzt wird, muss man sich das bis dorthin gemerkt haben, oder sucht erst einmal wieder rückwärts durch den Quelltext wo eigentlich die erste Zuweisung war. Zumal dieses manuelle hochzählen kürzer und übersichtlicher mit der `enumerate()`-Funktion gemacht werden kann.
Werte mit ``+`` und `str()` zu Zeichenketten zusammenzusetzen ist eher BASIC denn Python. In Python gibt es die `format()`-Methode auf Zeichenketten dafür.
Die Ausgabe was da umbenannt wird, sollte *vor* dem `rename()`-Aufruf gemacht werden. Sollte bei dem etwas schief laufen, zum Beispiel ein Rechteproblem, dann sieht der Benutzer wenigstens bei welcher Datei das Problem aufgetaucht ist.
Ich komme dann auf etwas in dieser Art (ungetestet):
Code: Alles auswählen
import os
from glob import glob
def get_dir():
while True:
result = input('Arbeitsverzeichnis (Return = Startverzeichnis): ')
if os.path.isdir(result):
return result
print('Verzeichnis nicht gefunden!')
def main():
directory = get_dir()
extension = input('Welche Erweiterung: (Bsp: jpg) ')
pattern = os.path.join(directory, '*.' + extension)
filenames = glob(pattern)
print('Gefundene ', extension, '- Dateien: ', len(filenames))
new_name = input('Wie soll der Namenteil NEU lauten: ')
for index, filename in enumerate(filenames, 1):
new_filename = os.path.join(
directory, '{0}_{1}.{3}'.format(new_name, index, extension)
)
print(filename, '->', new_filename)
os.rename(filename, new_filename)
if __name__ == '__main__':
main()