os.walk + os.renames "absichern"

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
Nebelhom
User
Beiträge: 155
Registriert: Mittwoch 19. Mai 2010, 01:31

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.
Zuletzt geändert von Nebelhom am Mittwoch 14. Dezember 2011, 18:02, insgesamt 1-mal geändert.
nomnom
User
Beiträge: 487
Registriert: Mittwoch 19. Mai 2010, 16:25

In der Dokumentation steht zumindest nichts von der Tiefe der Unterverzeichnisse: os.walk()
Nebelhom
User
Beiträge: 155
Registriert: Mittwoch 19. Mai 2010, 01:31

@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 ;)
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.
Nebelhom
User
Beiträge: 155
Registriert: Mittwoch 19. Mai 2010, 01:31

@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...
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``.
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.
Nebelhom
User
Beiträge: 155
Registriert: Mittwoch 19. Mai 2010, 01:31

@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.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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 ;-)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Nebelhom
User
Beiträge: 155
Registriert: Mittwoch 19. Mai 2010, 01:31

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 ;)
Antworten