Seite 1 von 1

os.walk + os.renames "absichern"

Verfasst: Mittwoch 14. Dezember 2011, 15:22
von Nebelhom
Hi Jungs,

ich musste kürzlich ca. 400 digitale Fotos umbenennen, weil die aus irgendeinem Grund von dem Entwickler auf beiden DVDs genau gleich-genannt wurden und ich die eigentlich im selben Verzeichnis haben wollte.

Da habe ich mir kurzerhand folgendes Skript zusammengewurstelt, was auch funktioniert. Das ist bis jetzt nur Proof of Concept, also ich kümmere mich um die Dateiendungen etc. noch später.

Code: Alles auswählen

import os

def change_all_filenames(directory):
    i = 0
    for root, dirs, files in os.walk(directory):
        for f in files:
            os.renames(os.path.join(root,f),
                       os.path.join(root, "Dispos{0}".format(i)))
            i += 1

if __name__ == "__main__":
    change_all_filenames('/home/nebelhom/Practice Folder')
Da dieses Skript aber, wenn man nicht aufpasst, alle Dateien auf der Festplatte in DisposX umbenennen kann, wollte ich von euch mal wissen, wie ihr so etwas "absichern" würdet, quasi eine Kindersicherung ;)

Mir fiel bis jetzt nur ein, erst auf alle möglichen Strings in der variable "directory" zu testen (== '/home', oder in Windows den Ordner WINDOWS angegeben etc etc.). Kann man u. U. bei os.walk() einstellen wie viele Unterverzeichnisse die Funktion durchlaufen soll?

Danke für euren Input.

EDIT: Ich vergaß zu erwähnen: Python Version 2.6 und OS ist Ubuntu wird aber auch dann in Windows XP ausprobiert.

Re: os.walk + os.renames "absichern"

Verfasst: Mittwoch 14. Dezember 2011, 16:16
von nomnom
In der Dokumentation steht zumindest nichts von der Tiefe der Unterverzeichnisse: os.walk()

Re: os.walk + os.renames "absichern"

Verfasst: Mittwoch 14. Dezember 2011, 16:22
von Nebelhom
@nomnom: Jo, die Doku habe ich mir auch schon durchgeschaut. Weiss ehrlich gesagt auch nicht so genau, warum ich das gefragt habe. Vielleicht aus der Hoffnung heraus, das das in der Doku ausgelassen wurde oder es eine ganz tolle, ähnliche methode gibt (os.walks() oder so), mit der man das einstellen kann ;)

Re: os.walk + os.renames "absichern"

Verfasst: Mittwoch 14. Dezember 2011, 20:58
von BlackJack
Ich würde in solche Skripte immer ein Flag einbauen was die Umbenennungen nur Anzeigen, aber nicht ausführen lässt. Dann kann man das einmal laufen lassen und sich sorgfältig anschauen was passieren würde, wenn man es tatsächlich los lässt.

Re: os.walk + os.renames "absichern"

Verfasst: Donnerstag 15. Dezember 2011, 00:37
von Nebelhom
@BlackJack: Danke. Gute Idee!

Ich schätze mal, wer solche Funktionen anfasst, sollte wohl auch wissen, was er tut ;) Würdest du die Flag so integrieren, dass man sie bewusst ausschalten muss oder eher dass man sie bewusst anschalten muss. Ich weiß gerade nicht, was klüger wäre...

Re: os.walk + os.renames "absichern"

Verfasst: Donnerstag 15. Dezember 2011, 00:41
von BlackJack
@Nebelhom: Klüger wäre wahrscheinlich das man das Programm erst „scharf schalten“ müsste. Aber ich würde wohl den anderen Weg gehen, denn da gibt es schon einen einschlägigen Namen für die Option: ``--dry-run``.

Re: os.walk + os.renames "absichern"

Verfasst: Donnerstag 15. Dezember 2011, 08:57
von lunar
@BlackJack: Für die umgekehrte Richtung gibt es auch einen Namen "--force" ;)

@Nebelhom: Ohne weitere Optionen kann das Programm ja eine Art interaktiven Modus bieten, beispielsweise jede einzelne Umbenennung durch Benutzereingabe bestätigen lassen, oder erst alle anzeigen, und am Schluss durch Benutzereingabe bestätigen.

Re: os.walk + os.renames "absichern"

Verfasst: Donnerstag 15. Dezember 2011, 09:20
von Nebelhom
@BlackJack: Jo, so ungefähr sah mein Gedankengang auch aus...

@lunar: Wie genau stellst du dir das vor? Mit einer GUI mit checkbox (fuer eine liste) bzw. Ja/nein dialog (für einzelne Dateien) oder via command line und immer y/n druecken? Bei jedem einzelnen Bild sowas zu machen, könnte das in meinem Fall mit 400 oder so fotos nach einer Weile nervig werden, aber ehrlich gesagt, fällt mir da nix besseres ein.

Ist schon lustig, dass es aufwendiger ist, das skript "sicher" zu machen, als es überhaupt erstmal zu schreiben :P

Danke euch für die Ideen.

Re: os.walk + os.renames "absichern"

Verfasst: Donnerstag 15. Dezember 2011, 10:28
von Hyperion
Nebelhom hat geschrieben: ... oder via command line und immer y/n druecken? Bei jedem einzelnen Bild sowas zu machen, könnte das in meinem Fall mit 400 oder so fotos nach einer Weile nervig werden, aber ehrlich gesagt, fällt mir da nix besseres ein.
Naja, das ist doch bei vielen UNIX-System-Kommandos auch so. Dafür gibt es ja das Tool "yes", welches dieses Sicherheitssystem wieder benutzbar macht ;-)

Re: os.walk + os.renames "absichern"

Verfasst: Donnerstag 15. Dezember 2011, 13:45
von Nebelhom
Abschließend, danke für die Vorschläge. Jetzt kann ich mit der funktion ein bißchen rumspielen :) Ich werde wohl noch eine variable geben mit der man die gewünschten datei endungen angeben kann. Das ist dann schon genug eingeengt, um nicht ausversehen eine Katastrophe verursachen zu können ;)