@01detlef: Mal abgesehen davon, dass ich statt `join()` hier den ``+``-Oerator verwenden würde, überlege doch mal selbst ob das Sinn macht. Mal angenommen es wären keine Fehler drin, würdest Du den Namen zerlegen und wieder zusammen setzen und dann von welchem Namen zu welchem Namen umbenennen‽
Gehe in Gedanken durch was jede Anweisung zur Laufzeit macht, spiele also selbst Python-Interpreter. Stell Dir selbst die Frage „Welcher Wert ist wann an welchen Namen gebunden?” und beantworte sie Dir. Dann vergleichst Du Deine Erwartungen mit der Realität. Zum Beispiel in dem Du ein paar ``print``-Anweisungen einstreust um die Werte zu überprüfen. Probiere an einem Verzeichnis mit Testdateien mit entsprechenden Namen.
Der Name `file` ist irreführend, weil `glob()` keine Datei-Objekte, sondern Zeichenketten liefert, die Pfad- bzw. Dateinamen enthalten.
Vielleicht solltest Du auch nicht so viel Quelltext schreiben ohne ihn auszuprobieren. Und ja, vier Zeilen können für einen Anfänger schon viel sein. Entwickle den Code nicht, in dem Du viel schreibst und dann hier nachfragst, sondern in dem Du das selber Stück für Stück entwickelst, und jeden Schritt testest und erst weiteren, neuen Quelltext dazu schreibst, wenn der bisherige das (Teil)Ergebnis liefert, welches Du haben wolltest.
Das fängt an mit einem Grundgerüst:
Code: Alles auswählen
#!/usr/bin/env python
from glob import glob
def main():
for path in glob('Name*'):
print path
if __name__ == '__main__':
main()
Laufen lassen und schauen ob das bis dahin das tut was es soll:
Code: Alles auswählen
bj@s8n:~/tmp$ ls Name*
Name_i=10_18372.txt Name_i=15_76382.txt Name_i=5_12345.txt
bj@s8n:~/tmp$ ./test.py
Name_i=5_12345.txt
Name_i=15_76382.txt
Name_i=10_18372.txt
Nächster Schritt ist das zerlegen des Dateinamens in Name und Erweiterung:
Code: Alles auswählen
for path in glob('Name*'):
old_filename, extension = os.path.splitext(path)
print old_filename, '|', extension
Testlauf:
Code: Alles auswählen
bj@s8n:~/tmp$ ./test.py
Name_i=5_12345 | .txt
Name_i=15_76382 | .txt
Name_i=10_18372 | .txt
Dann setzt Du beides wieder zusammen:
Code: Alles auswählen
for path in glob('Name*'):
old_filename, extension = os.path.splitext(path)
new_filename = old_filename + extension
print old_filename, '->', new_filename
Testlauf:
Code: Alles auswählen
bj@s8n:~/tmp$ ./test.py
Name_i=5_12345 -> Name_i=5_12345.txt
Name_i=15_76382 -> Name_i=15_76382.txt
Name_i=10_18372 -> Name_i=10_18372.txt
An der Stelle kann man vielleicht auch schon erahnen was die Sinnhaftigkeit eines Umbenennens von `old_filename` nach `new_filename` angeht. Dann sollte man hier nicht mit `os.rename()` weiter machen, sondern erst einmal dafür sorgen, dass die Daten bis zu diesem Punkt im Programmablauf sinnvolle Werte annehmen.
Falls das Problem nicht offensichtlich war, wird es spätestens beim Versuch umzubenennen klar:
Code: Alles auswählen
for path in glob('Name*'):
old_filename, extension = os.path.splitext(path)
new_filename = old_filename + extension
print old_filename, '->', new_filename
os.rename(old_filename, new_filename)
Testlauf:
Code: Alles auswählen
bj@s8n:~/tmp$ ./test.py
Name_i=5_12345 -> Name_i=5_12345.txt
Traceback (most recent call last):
File "./test.py", line 15, in <module>
main()
File "./test.py", line 11, in main
os.rename(old_filename, new_filename)
OSError: [Errno 2] No such file or directory
Wenn man länger programmiert und die Erfahrung wächst, werden die Quelltextabschnitte grösser, die man zwischen Testläufen schreiben kann, ohne dass man zu viele Fehler in den Abschnitt einbaut. Aber für den Anfang kann es Sinn machen jede Zeile zu prüfen ob sie den Erwartungen entspricht, bei komplexeren Sachen sogar für Teilausdrücke innerhalb einer Zeile.