Dateinamen mit 2 Listen umbenennen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
vevi
User
Beiträge: 2
Registriert: Dienstag 2. Juni 2020, 11:45

Hi an Alle,

ich habe ein Problem mit einem Script und komme einfach nicht weiter.

Ich habe einen Ordner mit Dateien (old1.txt, old2 old3.txt …usw), die ich umbenennen will in.
Ich habe zwei Listen angelegt, die jeweils die alten und die neuen Namen nacheinander enthalten.
Leider funktioniert mein Script nicht. Es wird nur eine Datei umbenannt, das wars.

Ich bin relativ neu in Python. Wo ist der Fehler in meiner Logik bzw. Syntax?
Würde ich sehr über einen Tipp freuen!!

Claus

Code: Alles auswählen

import os


path = "/Users/mac/Desktop/folder"

old = ["old1", "old2", "old3"]
new = ["1000", "3000", "2000"]


for x in old:
  for y in new:
	for filename in os.listdir(path):
		# filename am Punkt splitten
		filename_without_extension = os.path.splitext(filename)[0]
		extension = os.path.splitext(filename)[1]
		#filename vor dem Punkt umbenennen
		filename_new = filename_without_extension.replace(x,y)
		print filename_new
		filename_new_with_ext = filename_new+extension
		os.rename(os.path.join(path,filename),os.path.join(path,filename_new_with_ext))
		
    
Benutzeravatar
__blackjack__
User
Beiträge: 13100
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@vevi: Die Schleifen sind falsch. Die äussere Schleife führt das für jeden alten Namen aus. Und die nächste Schleife dann für jeden neuen Namen. Die innerste ``for``-Schleife wird also in diesem Fall 9× gestartet und geht alle Dateinamen durch. Die sollte aber nur 3x gestartet werden, einmal für jedes alt/neu-Paar. Und so würde man die Daten auch eher organisieren: in einer Liste mit Tupeln, die jeweils das passende Paar aus alt und neu enthalten.

`splitext()` wird sinnloser weise zweimal mit dem gleichen Dateinamen aufgerufen, nur um jedes mal einen der beiden Teile des Ergebnisses weg zu werfen.

Du verwendest hier noch Python 2. Das sollte man nicht mehr machen. Und dann auch nicht mehr das `os`-Modul, sondern das `pathlib`-Modul.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Benutzeravatar
__blackjack__
User
Beiträge: 13100
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Ungetestet:

Code: Alles auswählen

#!/usr/bin/env python3
from pathlib import Path


def main():
    base_path = Path("/Users/mac/Desktop/folder")

    for old, new in [("old1", "1000"), ("old2", "3000"), ("old3", "2000")]:
        for path in base_path.glob(f"*{old}*.*"):
            path.rename(
                path.with_name(path.stem.replace(old, new) + path.suffix)
            )


if __name__ == "__main__":
    main()
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
vevi
User
Beiträge: 2
Registriert: Dienstag 2. Juni 2020, 11:45

Mega Danke! Ich habe es hinbekommen, musste allerdings Python 2.7 verwenden.
Antworten