Ich habe ein Problem beim Löschen leerer Verzeichnisse. Hier ist mein Code:
for dirpath, dirnames, filenames in os.walk(dir_to_search):
//other codes
try:
os.rmdir(dirpath)
except OSError as ex:
print(ex)
Das Argument dir_to_search
ist, wo ich das Verzeichnis übergebe, in dem die Arbeit erledigt werden muss. Das Verzeichnis sieht folgendermaßen aus:
test/20/...
test/22/...
test/25/...
test/26/...
Beachten Sie, dass alle oben genannten Ordner leer sind. Als ich dieses Skript die Ordner laufen 20
, 25
wird allein gelöscht! Aber die Ordner 25
und 26
werden nicht gelöscht, obwohl sie leere Ordner sind.
Bearbeiten:
Die Ausnahme, die ich bekomme, sind:
[Errno 39] Directory not empty: '/home/python-user/shell-scripts/s3logs/test'
[Errno 39] Directory not empty: '/home/python-user/shell-scripts/s3logs/test/2012'
[Errno 39] Directory not empty: '/home/python-user/shell-scripts/s3logs/test/2012/10'
[Errno 39] Directory not empty: '/home/python-user/shell-scripts/s3logs/test/2012/10/29'
[Errno 39] Directory not empty: '/home/python-user/shell-scripts/s3logs/test/2012/10/29/tmp'
[Errno 39] Directory not empty: '/home/python-user/shell-scripts/s3logs/test/2012/10/28'
[Errno 39] Directory not empty: '/home/python-user/shell-scripts/s3logs/test/2012/10/28/tmp'
[Errno 39] Directory not empty: '/home/python-user/shell-scripts/s3logs/test/2012/10/26'
[Errno 39] Directory not empty: '/home/python-user/shell-scripts/s3logs/test/2012/10/25'
[Errno 39] Directory not empty: '/home/python-user/shell-scripts/s3logs/test/2012/10/27'
[Errno 39] Directory not empty: '/home/python-user/shell-scripts/s3logs/test/2012/10/27/tmp'
Wo mache ich einen Fehler?
rmdir /path/to/25th/folder
das gesamte Verzeichnis. Was bedeutet, dass das Verzeichnis leer ist!Antworten:
Versuchen Sie
shutil.rmtree
:quelle
rmtree
das gesamte Verzeichnis? Ich denke , es ist ähnlich demrm -Rf $DIR
import os for root, dirs, files in os.walk(top, topdown=False): for name in dirs: os.rmdir(os.path.join(root, name))
Das Standardverhalten von
os.walk()
ist das Gehen von der Wurzel zum Blatt. Machen Sie sichtopdown=False
aufos.walk()
den Weg vom Blatt zur Wurzel.quelle
Hier ist mein reiner
pathlib
rekursiver Verzeichnis-Unlinker:quelle
Versuchen Sie
rmtree()
inshutil
der Python - Standardbibliothekquelle
rmtree
das gesamte Verzeichnis? Ich denke , es ist ähnlich demrm -Rf $DIR
Verwenden Sie besser den absoluten Pfad und importieren Sie nur die Funktion rmtree,
from shutil import rmtree
da dies ein großes Paket ist. In der obigen Zeile wird nur die erforderliche Funktion importiert.quelle
rmtree()
; nichtshutil.rmtree()
Nur für den nächsten, der nach einer Mikropython-Lösung sucht, funktioniert dies ausschließlich auf der Basis von OS (listdir, remove, rmdir). Es ist weder vollständig (insbesondere bei der Fehlerbehandlung) noch ausgefallen, funktioniert jedoch in den meisten Fällen.
quelle
Der Befehl (von Tomek gegeben) kann eine Datei nicht löschen , wenn sie schreibgeschützt ist . daher kann man verwenden -
quelle
NameError: name 'stat' is not defined
. Wie wurde es definiert?Hier ist eine weitere reine Pathlib-Lösung , jedoch ohne Rekursion:
quelle
Hier ist eine rekursive Lösung:
quelle
Für Linux-Benutzer können Sie den Shell-Befehl einfach pythonisch ausführen
wo
rm
steht für entfernen und-r
für rekursivquelle