Verzeichnisse 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
wattwurm
User
Beiträge: 29
Registriert: Sonntag 25. Januar 2015, 17:27
Wohnort: Nordsee

Hallo,
ich bin neu hier und wollte mal eine Frage stellen (Google und co. haben mich nicht weiter gebracht).
Ich habe mir ein Verzeichnis (test) mit Unterordner erstellt:

/home/thomas/script/test/Neuer Ordner
/home/thomas/script/test/verz name 1
/home/thomas/script/test/verz name 1/verz name 2
/home/thomas/script/test/verz name 1/verz name 2/verz name3
/home/thomas/script/test/verz name 1/verz name 2/verz name3/verz name4

Nun sollen die Leerzeichen durch Unterstriche ersetzt werden:

Code: Alles auswählen

# -*- coding: utf-8 -*-

import os 
#*************Variablen
suchpfad = '/home/thomas/script/test' #Fuer os.walk
trennzeichen = ' '
l_pfad = []


#*********Dateien suchen mit walk**********
for verzeichnis, unterverzeichnis, dateien in os.walk(suchpfad):
    for v_name in unterverzeichnis:
        g_pfad=(os.path.join(verzeichnis, v_name))#gesamtpfad zusammensetzen
        #print('Gesamtpfad:', g_pfad)
        if trennzeichen in g_pfad:
            #print('habe was gefunden:', g_pfad)
            l_pfad.append(g_pfad)
            for alt in l_pfad:
                neu = alt.replace(' ', '_')
                ##os.rename(alt, neu)
           ##print(alt)  
##            print('alt:', alt)
            print('neu:', neu)
print('***ENDE***')
Wenn das Script ausgeführt scheint auch alles bis Zeile 19 zu funzen:
neu: /home/thomas/script/test/Neuer_Ordner
neu: /home/thomas/script/test/verz_name_1
neu: /home/thomas/script/test/verz_name_1/verz_name_2
neu: /home/thomas/script/test/verz_name_1/verz_name_2/verz_name3
neu: /home/thomas/script/test/verz_name_1/verz_name_2/verz_name3/verz_name4
***ENDE***
Sobalt ich os.rename auskommentiere und das Script starte bekomme ich eine Fehlermeldung:
neu: /home/thomas/script/test/Neuer_Ordner
Traceback (most recent call last):
File "/home/thomas/script/walk2.py", line 20, in <module>
os.rename(alt, neu)
OSError: [Errno 2] No such file or directory
>>>
Es scheint als ob das Script die Pfade zu den Verzeichnissen nicht findet, was mache ich da falsch?

achso, der Ordner (/home/thomas/script/test/Neuer_Ordner) wird tatsächlich umbennant.
Meine OS ist Linux (Debian - Jessie)

Ostfriesische Grüße :D
Thomas
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Hallo und willkommen im Forum!

Das Problem ist, dass einige Verzeichnisse noch nicht existieren. Nehmen wir zum Beispiel mal "/home/thomas/script/test/verz name 1/verz name 2". Da wird dann versucht, dass Verzeichnis "verz_name_2" in "verz_name_1" zu verschieben. Da letzteres aber noch nicht existiert, funktioniert das nicht. Vielleicht schaust du noch einmal in die Dokumentation des os-Moduls uns suchst nach einer anderen rename-Funktion ;-)
Das Leben ist wie ein Tennisball.
wattwurm
User
Beiträge: 29
Registriert: Sonntag 25. Januar 2015, 17:27
Wohnort: Nordsee

Hallo,
os-Moduls uns suchst nach einer anderen rename-Funktion
meinst Du renames ?
Leider bekomme ich da auch eine Fehlermeldung :cry:
neu: /home/thomas/script/test/Neuer_Ordner
Traceback (most recent call last):
File "/home/thomas/script/walk2.py", line 22, in <module>
os.renames(alt, neu)
File "/usr/lib/python3.2/os.py", line 208, in renames
rename(old, new)
OSError: [Errno 2] No such file or directory
>>>
Ich habe mal os.path.exists bemüht, demnach sind alle Verzeichisse vorhanden.
Da bin ich wohl völlig aufm falschen Dampfer :K
Sirius3
User
Beiträge: 17749
Registriert: Sonntag 21. Oktober 2012, 17:20

@wattwurm: was glaubst Du, was l_pfad enthält, vor allem wenn die zweite Datei umbenannt werden soll? Die Probleme mit Unterverzeichnissen kommen dann ja später auch noch dazu.
wattwurm
User
Beiträge: 29
Registriert: Sonntag 25. Januar 2015, 17:27
Wohnort: Nordsee

Einen schönen Sonntag wünsche ich!
Erstmal ein dankeschön das Ihr auf solche Anfängerfragen antwortet!!! :)

Leider komme ich mit meinem "Script" überhaupt nicht weiter :(

So sieht es im Moment aus:

Code: Alles auswählen

# -*- coding: utf-8 -*-

import os, shutil 
#*************Variablen
suchpfad = '/home/thomas/script/test' #Fuer os.walk
trennzeichen = ' '
l_pfad = []


#*********Dateien suchen mit walk**********
for verzeichnis, unterverzeichnis, dateien in os.walk(suchpfad, topdown = False):
    #print(verzeichnis)
##    if trennzeichen in verzeichnis:
##        l_pfad.append(os.path.join(verzeichnis))
##        print(dateien)
##
##for alt in l_pfad:
##    #pass
##    print(alt)
##    neu = alt.replace(' ', '_')
##    print(neu)
##    #shutil.move(alt, neu)
##    #os.renames(alt, neu)

    for name in unterverzeichnis:
        alt = os.path.join(verzeichnis, name)
        print(alt)
        neu = alt.replace(' ', '_')
        print(neu)
        os.renames(alt, neu)
print('***ENDE***')

ersetz mir zwar die Leerzeichen "/home/thomas/script/test/verz name 1 bis /home/thomas/script/test/verz name 1/verz name 2/verz name3/verz name4" durch Unterstriche, lässt aber den Ordner "/home/thomas/script/test/Neuer Ordner" völlig unangetastet.
Eine exception schmeiß Python auch noch raus:
Traceback (most recent call last):
File "/home/thomas/script/walk2diezweite.py", line 30, in <module>
os.renames(alt, neu)
File "/usr/lib/python3.2/os.py", line 208, in renames
rename(old, new)
OSError: [Errno 2] No such file or directory
Eure Hilfestellungen sind nett gemeint, aber für mich als Anfänger nicht unbedingt zu verstehen.
Ich weiß ja, lesen lesen lesen, dass mache ich auch, aber ab und zu braucht man auch mal Erfolgserlebnisse um die Motivation nicht zu verlieren.
Weitere Tips nehme ich gerne entgegen :wink: (gebe auch gerne mal ein Bier aus :D )

Gruß
Thomas
Sirius3
User
Beiträge: 17749
Registriert: Sonntag 21. Oktober 2012, 17:20

@wattwurm: was ist denn das letzte Verzeichnis, das er versucht umzubenennen, bei dem es aber dann schief läuft? Wenn Du das weißt, kannst Du ja versuchen, zu verstehen, warum das Umbenennen nicht klappt.
wattwurm
User
Beiträge: 29
Registriert: Sonntag 25. Januar 2015, 17:27
Wohnort: Nordsee

O nee nä......
ich brauche die Zweite for Schleife gar nicht, oder?

alt.replace(' ', '_') -> /home/thomas/script/test/verz_name/unter_verz_name_1/unter_verz_name_2/unter_verz_name_3/unter_verz_4
os.renames(alt, neu) -> Alles umbenennen und fertig ist der Lack

Richtig?

Hmmm, werde ich gleich mal ausprobieren
wattwurm
User
Beiträge: 29
Registriert: Sonntag 25. Januar 2015, 17:27
Wohnort: Nordsee

Moin,
meine obere Erleuchtung war leider nichts :? :oops:

Jetzt hab eich es so gemacht:

Code: Alles auswählen

# -*- coding: utf-8 -*-

import os


for pfad, verzeichnis, dateien in os.walk('/home/thomas/script/test',topdown = False):
    for v_name in verzeichnis:
        if ' ' in v_name:
            #print(v_name)
            neu = v_name.replace(' ', '_')
            alt_pfad = os.path.join(pfad, v_name)
            neu_pfad = os.path.join(pfad, neu)
##            print(alt_pfad)
##            print(neu_pfad)
            os.rename(alt_pfad, neu_pfad)
print('*****ENDE*****')
Ich war ganz erschrocken als das Script ohne Fehler durchlief und auch noch die Verzeichnisse umbenannt hat *freu
wattwurm
User
Beiträge: 29
Registriert: Sonntag 25. Januar 2015, 17:27
Wohnort: Nordsee

Hallo,
nachdem das umbenenen der Verzeichnisse ja klappt wollte ich das Script ein wenig erweitern.
Jetzt sollen auch Dateien mit Leerzeichen gesucht, und umbenannt werden.
Zusätzlich würde ich gerne das umbenenen (.replace,... os.rename) in eine Funktion packen (macht das Sinn?)

So sieht das Script im Moment aus:

Code: Alles auswählen

# -*- coding: utf-8 -*-
import os
suchpfad = '/home/thomas/script/test'


def ersetze_leerz():
    pass
##    neu = v_name.replace(' ', '_')
##            alt_pfad = os.path.join(pfad, v_name)
##            neu_pfad = os.path.join(pfad, neu)
##            os.rename(alt_pfad, neu_pfad)
for pfad, verzeichnis, dateien in os.walk(suchpfad, topdown=False):
    for name in verzeichnis:
        if ' ' in name:
            print(name)
    for name in dateien:
        if ' ' in name:
            print(name)
print('*****ENDE*****')
Ich finde die beiden for-schleifen (verzeichnis und dateien) etwas unglücklich, kann man das auch anders machen?
Wäre die List Comprehensions eine Lösung?

Gruß
Thomas
Antworten