Seite 1 von 1

Volle Verzeichnisse löschen

Verfasst: Montag 9. Mai 2005, 13:28
von Stifferle
Hi,

ich suche nach einer einfachen Möglichkeit Verzeichnisse zu löschen in denen unter Umständen auch etwas drin steht (evtl sogar weitere Verzeichnisse mit weiterem Inhalt). Als Lösung ist mir bis jetzt nur eingefallen in jedem Verzeichniss alle Dateien aufzulisten, diese zu löschen, dann das Verzeichnis zu löschen....usw.
Diese Lösung erscheint mir aber viel zu umständlich :?

Jemand ne Idee/Vorschlag/Tip??

Danke schonmal im Vorraus
Gruß
Stifferle

Nachtrag

Verfasst: Montag 9. Mai 2005, 13:51
von Stifferle
Hi,

vielleicht ist noch zu erwähnen das ich den Befehl rmdir() und auch den Befehl removedirs() probiert habe, aber beide schmeißen eine Exception wenn der Ornder nicht leer ist.

also im Prinzip brauch ich nur etwas wieremovedirs() das die Dateien trotzdem löscht...gibt es sowas???

Gruß
Stifferle

Verfasst: Montag 9. Mai 2005, 14:10
von Leonidas
Aus einer alten pywin und Python 2.2 Dokumentation , etwas angepasst, so dass es auch ohne pywin32 geht:

Code: Alles auswählen

import os

def del_dir(path):
    for file in os.listdir(path):
        file_or_dir = os.path.join(path,file)
        if os.path.isdir(file_or_dir):
            del_dir(file_or_dir)
        else:
            os.remove(file_or_dir)

        os.rmdir(path)

re:

Verfasst: Montag 9. Mai 2005, 14:10
von HarryH
Hi,

Unter Windows geht folgende Möglichkeit:

Code: Alles auswählen

root = "C:\Programme\New"
os.popen('rd /s /q "%s"' % root)
Dabei wird der Windows-CMD-Befehl abgegeben und ausgeführt.

Edit (Leonidas): Code in Python-Tags gesetzt.

Re: re:

Verfasst: Montag 9. Mai 2005, 14:13
von Leonidas
HarryH hat geschrieben:Unter Windows geht folgende Möglichkeit:
[snip]
Dabei wird der Windows-CMD-Befehl abgegeben und ausgeführt.
Warum sowas machen wenn man auch Pythons eigene Funktionen nutzen kann, die zudem noch unter anderen OSen laufen? (Ja, unter Linux und Co hätte man rm -r nehmen können, aber warum?)

Verfasst: Montag 9. Mai 2005, 14:24
von mawe
Hi Leonidas!

Code: Alles auswählen

import os

def del_dir(path):
    for fil in os.listdir(path):
        file_or_dir = os.path.join(path,fil)
        if os.path.isdir(file_or_dir):
            del_dir(file_or_dir)
        else:
            os.remove(file_or_dir)
    os.rmdir(path)
So funktionierts ;) (und seit wann nennen wir eine Variable file? :)

Gruß, mawe

Verfasst: Montag 9. Mai 2005, 14:31
von Leonidas
mawe hat geschrieben:(und seit wann nennen wir eine Variable file? :)
Seitdem wir (resp. ich) zu blöd sind (bin), uns (mir) den Quellcode des Beispiels genauer anzusehen... aje, sorry, normalerweise achte ich drauf.

Danke!

Verfasst: Montag 9. Mai 2005, 14:50
von Stifferle
Hallo,

vielen, vielen Dank für eure Hilfe. Obwohl ich sagen muss das HarryH's Lösung einen gewissen Reiz auf mich ausübt (ich sag nur 'Quick n Dirty' :wink: ), hab ich doch die Lösung von Leonidas übernommen.

Funktioniert tadellos, natürlich erst mit der Korrektur von mawe!

Also nochmal vielen Dank und viel Spaß noch
Grüße
Stifferle

Verfasst: Montag 9. Mai 2005, 22:39
von BlackJack
``shutil.rmtree(path)`` ist viel kürzer und funtkioniert unter allen Plattformen.

Verfasst: Dienstag 10. Mai 2005, 06:23
von mawe
Hi Blackjack!

Stimmt, aber das Modul muss man auch erst mal kennen ;) Mir ist das noch nie aufgefallen, hat aber auch keinen sehr einleuchtenden Namen :)

NACHTRAG: Also irgendwie hätte man die paar Funktiönchen von shutil auch noch in os packen können. :?

Gruß, mawe

Verfasst: Dienstag 10. Mai 2005, 12:31
von Leonidas
mawe hat geschrieben:NACHTRAG: Also irgendwie hätte man die paar Funktiönchen von shutil auch noch in os packen können. :?
Oder lieber andersrum, die Dateisachen aus os in shutil.

Verfasst: Dienstag 10. Mai 2005, 12:59
von mawe
Richtig! Und vielleicht auch anders nennen. Soll das eine Abkürzung für shell utils sein?

Verfasst: Dienstag 10. Mai 2005, 21:47
von BlackJack
Ja ist damit gemeint.

Verfasst: Mittwoch 14. Januar 2009, 15:46
von azami1986
Hallo Leute,

kann es sein, dass folgender Funktion lediglich alle Dateien in der ersten ebene löscht?

Code: Alles auswählen

import os

def del_dir(path):
    for fil in os.listdir(path):
        file_or_dir = os.path.join(path,fil)
        if os.path.isdir(file_or_dir):
            del_dir(file_or_dir)
        else:
            os.remove(file_or_dir)
    os.rmdir(path)
Ich habe einen Verzeichnis, und in ihr sind weitere Verzeichnisse und Daten enthalten. Wie kann ich alle Unterverzeichnisse und Dateien löschen bzw. wie müsste ich den Code von Leonidas erweitern?

PS: Bin Windowsnutzer

Verfasst: Mittwoch 14. Januar 2009, 15:50
von Pekh
:? Lies dir bitte noch mal alle Beiträge zu diesem Thema gründlich durch. Dann wirst du eine sehr schöne, saubere und kurze Lösung finden.

Verfasst: Mittwoch 14. Januar 2009, 16:00
von azami1986
Danke für die schnelle Antwort, jedoch möchte ich es nicht mit

Code: Alles auswählen

shutil.rmtree(path)
lösen, da ich selber python 2.5 benutze. Gibts da keine Allgemeine Lösung, wo man es auch in Python 2.5 macht?

Verfasst: Mittwoch 14. Januar 2009, 16:03
von azami1986
Problem gelöst :-) Trotzdem Danke

Verfasst: Mittwoch 14. Januar 2009, 16:08
von snafu
Man macht es in Python 2.5 genau so, weil die Funktion nicht entfernt wurde.

http://docs.python.org/library/shutil.h ... til.rmtree (ja, das ist 2.6 Doku)