auto_renamer -> Dateinamen für's Internet cleanen...

Code-Stücke können hier veröffentlicht werden.
Antworten
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Brauchte ein kleines Skript, welches einige Dateinamen für's Internet cleant.
d.h. alle Umlaute und Leerzeichen umwandeln.

Mein Skript macht das im Aktuellen Verzeichniss und allen Unterverzeichnissen!

Code: Alles auswählen

#!/usr/bin/python
# -*- coding: ISO-8859-1 -*-

import os, sys, urllib

rules = [
    (" ", "_"),
    ("ä", "ae"),
    ("ö", "oe"),
    ("ü", "ue"),
    ("Ä", "Ae"),
    ("Ö", "Oe"),
    ("Ü", "Ue"),
    ("ß", "ss"),
]

class auto_renamer:
    def __init__( self ):
        self.cwd = os.getcwd()
        self.rename_dict = {}

    def go( self ):
        print "--- Aktuelles Verzeichnis: %s ---" % self.cwd

        print "scanne...",
        dir_numbers = self.make_rename_dict()
        print "%s Verzeichnisse durchsucht." % dir_numbers
        print

        if len(self.rename_dict) == 0:
            print "Keine Dateien müßen umbenannt werden!"
            sys.exit()

        self.print_result()
        print

        answer = raw_input("Sollen Dateien umbenannt werden? [j/n]")
        if answer != "j":
            sys.exit()

        self.rename_files()


    def make_rename_dict( self ):
        dir_numbers = 0
        for root,dirs,files in os.walk(""):
            self.check_files( os.path.join( self.cwd, root ), files )
            dir_numbers += 1
        return dir_numbers

    def check_files( self, work_dir, filelist ):
        for file_name in filelist:
            if urllib.quote( file_name ) == file_name:
                # Gibt nix zu ersetzten!
                continue

            clean_filename = self.clean_filename( file_name )

            if urllib.quote( clean_filename ) != clean_filename:
                print ">>> Error, urllib.quote():"
                print urllib.quote( clean_filename )
                continue

            self.rename_dict[ os.path.join( work_dir, file_name ) ] = clean_filename

    def clean_filename( self, filename ):
        for rule in rules:
            filename = filename.replace( rule[0], rule[1] )
        return filename

    def print_result( self ):
        for source, destination in self.rename_dict.iteritems():
            print source
            print "-->", destination

    def rename_files( self ):
        for source, destination in self.rename_dict.iteritems():
            dir,name = os.path.split( source )

            try:
                os.chdir( dir )
                print "rename: %s -> %s" % ( name, destination )
                os.rename( name, destination )
                print "OK"
            except Exception, e:
                print "rename error:", e

        # Zum Startverzeichnis wechseln
        os.chdir( self.cwd )


if __name__ == "__main__":
    auto_renamer().go()

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Unter Linux klappt ein os.walk("") nicht, mit os.walk(".") aber schon ;)

Also es muß die Zeile:

Code: Alles auswählen

        for root,dirs,files in os.walk(""):
durch

Code: Alles auswählen

        for root,dirs,files in os.walk("."):
getauscht werden.

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Antworten