Dateien umbennen, auch in Unterordnern

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
AHFHenry
User
Beiträge: 2
Registriert: Freitag 20. Juni 2014, 10:32

Ich habe folgenden Code geschrieben:

Code: Alles auswählen

import os
import re

def dir_list2(directory, *args):

    fileList = []
    content = os.walk(directory, topdown = False)

    for root, subFolders, files in content:
        for file in fileList:
        dirfile = os.path.join(directory, file)
        if os.path.isfile(dirfile):
            if len(args) == 0:
                fileList.append(dirfile)
            else:
                if os.path.splitext(dirfile)[1][1:] in args:
                    fileList.append(dirfile)
        #Adds Files to fileList

        print "##################################################"

        print "Old filename:", file
    
        filename = file
        remove = re.compile("[^.a-zA-z0-9_]")
        output = remove.sub('_', filename)

        newfile = directory + "/" + output
        os.rename(dirfile, newfile)

        print "Corrected filename:", output
        #Removes Special Characters

        #print "######################################"

        return fileList
 
if __name__ == '__main__':


    fileList = dir_list2('/path')

    #for f in fileList:
    #    print f
In Theorie funktioniert alles, aber ich habe versucht, dass er das ganze auch in Unterordnern tut. Und da hat leider mein Python Verständnis aufgehört. Wie muss ich den Code korrigieren, damit er funktioniert, auch in Unterordnern und Unterordnern von Unterordnern etc.?

Danke im voraus
Henry
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@AHFHenry: die Einrückungen sind falsch. Was soll `args` sein? Wenn Du der Funktion eine Liste mit Endungen übergeben willst, dann nenn die auch so. Bei einer Funktion die `dir_list2` heißt, erwarte ich nicht, dass die Dateien umbenennet. Das Erzeugen der fileList-Liste hat mit dieser Aufgabe auch gar nichts zu tun. Was soll die Funktion also tun? Das eine oder das andere? In Zeile 11 weißt Du noch, wie man Pfade verknüpft, in Zeile 28 nicht mehr. `root` enthält den Pfad zu den Dateien in `files`, `directory` immer den obersten Pfad. Eine Prüfung, ob der neue Dateiname schon existiert, wäre ganz hilfreich um Datenverlust zu vermeiden.
AHFHenry
User
Beiträge: 2
Registriert: Freitag 20. Juni 2014, 10:32

@Sirius3: Wie müsste ich das dann korrigieren?

Also mein vorheriger Code, der das renamen nur in einem Ordner und nicht in seinen Unterordnern tut sieht wie folgt aus:

Code: Alles auswählen

import os
import re

def dir_list2(directory, *args):

    fileList = []
    content = os.listdir(directory)

    for file in content :

        dirfile = os.path.join(directory, file)
        if os.path.isfile(dirfile):
            if len(args) == 0:
                fileList.append(dirfile)
            else:
                if os.path.splitext(dirfile)[1][1:] in args:
                    fileList.append(dirfile)

        print "##################################################"

        print "Old filename:", file
    
        filename = file
        remove = re.compile("[^.a-zA-z0-9_]")
        output = remove.sub('_', filename)

        newfile = directory + "/" + output
        os.rename(dirfile, newfile)

        print "Corrected filename:", output
        #Removes Special Characters

        #print "######################################"

    return fileList
 
if __name__ == '__main__':


    fileList = dir_list2('/path')

    #for f in fileList:
    #    print f
Dieser funktioniert fehlerfrei, aber ich hätte es halt auch ganz gerne, dass er das in den subDirectorys tut!
Zuletzt geändert von AHFHenry am Freitag 20. Juni 2014, 11:45, insgesamt 1-mal geändert.
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@AHFHenry: Du hast doch schon `os.walk` gefunden, jetzt mußt Du nur noch den richtigen Pfad nehmen.
Meine Kommentare, bis auf den mit der Einrückung, gelten für den zweiten Code genauso.
Antworten