Löschen leerer Ordner und Unterordner

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
JoBXX
User
Beiträge: 1
Registriert: Mittwoch 13. April 2016, 13:40

Mittwoch 13. April 2016, 13:47

Ich würde gerne in mehreren Verzeichnissen leere Ordner löschen?
Dies funktioniert so nicht?
Hat jemand eine einfachere Idee?

Code: Alles auswählen

import os, sys

path = r"R:\Daten\geo_daten"

def removeEmptyFolders(path, removeRoot=True):
  'Function to remove empty folders'
  if not os.path.isdir(path):
    return

  # remove empty subfolders
  files = os.listdir(path)
  if len(files):
    for f in files:
      fullpath = os.path.join(path, f)
      if os.path.isdir(fullpath):
        removeEmptyFolders(fullpath)

  # if folder empty, delete it
  files = os.listdir(path)
  if len(files) == 0 and removeRoot:
    print "Removing empty folder:", path
    os.rmdir(path)
    
def usageString():
  'Return usage string to be output in error cases'
  return 'Usage: %s directory [removeRoot]' % sys.argv[0]

if __name__ == "__main__":
  removeRoot = True
  
  if len(sys.argv) < 1:
    print "Not enough arguments"
    sys.exit(usageString())
    
  if not os.path.isdir(sys.argv[1]):
    print "No such directory %s" % sys.argv[1]
    sys.exit(usageString())
    
  if len(sys.argv) == 2 and sys.argv[2] != "False":
    print "removeRoot must be 'False' or not set"
    sys.exit(usageString())
  else:
    removeRoot = False
    
  removeEmptyFolders(sys.argv[1], removeRoot)
Zuletzt geändert von Anonymous am Mittwoch 13. April 2016, 14:37, insgesamt 1-mal geändert.
Grund: Quelltext in Code-Tags gesetzt.
lordzwieback
User
Beiträge: 55
Registriert: Montag 2. März 2015, 14:35
Kontaktdaten:

Freitag 15. April 2016, 07:50

Hallo,

müsste eigentlich etwas in die Richtung sein.

Du speicherst deinen "Überordnerpfad" in eine Variable, danach gehst du mit einer for-Schleife durch eine Liste der Ordner in deinem Überordner und löschst mittels des Befehls shutil.rmtree(OrdnerzumLöschen) den Ordner, auf dem er gerade sitzt.

Code: Alles auswählen

import os
import shutil

pfad = "PfadZumÜberordner"

if os.path.exists(pfad)
	for folder in os.listdir(pfad)
		shutil.rmtree(folder)
Kannst es ja mal an einem Testordner testen.

Grüße,
lordzwieback

EDIT: Den Code habe ich jetzt nicht getestet, deshalb lieber vorher am Testordner probieren. Wenn du über mehrere "Überordner" gehen magst, kannst du dir die Pfade in einer Liste speichern und bevor du prüfst, ob die Pfade vorhanden sind iterierst du über die Liste mit einer for-Schleife.
lordzwieback
User
Beiträge: 55
Registriert: Montag 2. März 2015, 14:35
Kontaktdaten:

Freitag 15. April 2016, 09:31

Hab grad mal noch ein wenig Zeit. Ich versuchs mal aus dem Gedächtnis:

Code: Alles auswählen

import os
import shutil

directory_list = [r"C:\temp\temp1", r"C:\temp\temp2", r"C:\temp\temp3"]

for path in directory_list:
	if os.path.exists(path)
		for folder in os.path.listdir(path)
			shutil.rmtree(folder)
Ich glaube, das könnte funktionieren. :K :lol:
Sirius3
User
Beiträge: 10806
Registriert: Sonntag 21. Oktober 2012, 17:20

Freitag 15. April 2016, 11:01

@lordzwieback: lies nochmals die Überschrift über diesem Thema.

@JoBXX: sieht doch schon fast einfachst aus.
Die übliche Schreibweise für Variablennamen und Funktionsnamen in Python ist klein_mit_unterstrichen. Das `if len(files):` ist übeflüssig, weil eine for-Schleife über eine leere Liste auch einfach nichts macht. Man könnte auch einfach versuchen das Verzeichnis mit rmdir zu löschen. Wenn es nicht leer ist, gibt es einen Fehler. Zum Parsen von Kommandozeilenargumenten gibt es das argparse-Modul.
lordzwieback
User
Beiträge: 55
Registriert: Montag 2. März 2015, 14:35
Kontaktdaten:

Freitag 15. April 2016, 11:37

Sirius3 hat geschrieben:@lordzwieback: lies nochmals die Überschrift über diesem Thema.
mea culpa. Nicht richtig gelesen.
hans
User
Beiträge: 728
Registriert: Sonntag 22. September 2002, 08:32
Wohnort: Sauerland
Kontaktdaten:

Freitag 15. April 2016, 22:43

Muss ich alles in Python machen? Geht dieses noch auf Windows Kommandozeile?

Code: Alles auswählen

dir *.txt /s /b > filelist.txt
Ist die Frage, wie de Datei sortiert ist. Noch idealer wäre es, wenn nur die Directories gelistet werden. Und dann absteigend sortieren. Kann es nicht ausprobieren. Bin arm und kann mir kein Windows leisten ;)
BlackJack

Samstag 16. April 2016, 10:20

@hans: Was hat denn das erstellen einer Datei mit den Dateinamen aller Textdateien in einem Verzeichnisbaum mit dem Löschen von leeren Ordnern und Unterordnern zu tun?

Bezüglich „muss es Python sein“: Falls es nicht nur auf einem System laufen soll, wäre eine DOS-Lösung nicht ausreichend. :-)
hans
User
Beiträge: 728
Registriert: Sonntag 22. September 2002, 08:32
Wohnort: Sauerland
Kontaktdaten:

Samstag 16. April 2016, 11:48

@BlackJack. Gleich m ersten Post steht path = r"R:\Daten\geo_daten". Von daher habe ich ein Windowslösung vorausgesetzt.

Warum Textdatei? Ganz einfach. Wenn ich die Directories in der Sortierung Oberste Ebene zuerst habe, dann kann ich die Datei Satz für Satz einlesen, das entsprechende Directory auf Inhalt prüfen und wenn es leer ist löschen. Zumindest bei Linux kommt das Problem der Symbolik Links hinzu. Unter Linux ist es kein Problem, solch eine Datei zu erstellen (mit oder ohne Symblic Link). Ist für mich die einfachste Logik.

Viele Wege führen nach Rom ;)
BlackJack

Samstag 16. April 2016, 14:03

@hans: Nur weil ein Beispiel einen konkreten Pfad verwendet der nach Windows aussieht, heisst das ja nicht automatisch das das am Ende nur für Windows sein soll. Andererseits fragst Du ja sogar ob es denn unbedingt in Python sein muss, obwohl das Beispiel in Python geschrieben ist. Und in einem Python-Forum gestellt wurde…

In der erstellten Textdatei mit den Dateinamen stehen Dateinamen drin die mit *.txt Enden. Die Pfade zu diesen Dateien können nicht leer sein, denn es sind ja entweder Unterordner die irgendwo eine Textdatei enthalten oder mindestens eine Textdatei darin, können also nicht gelöscht werden.

Wie liest Du die Datei Satz für Satz ein? Ja nicht mit Python, denn dann hätte man vorher keinen DOS-Befehl bemühen müssen.

Viele Wege mögen nach ROM führen, aber nicht alle, und ich sehe nicht ob Dein erster Schritt auf dem Weg, das irgendwann tatsächlich tut. Das ist für mich immer noch ein DOS-Befehl der keinen Schritt in die Richtung einer Lösung des Problems vom OP geht.
Antworten