Beim Versuch, einen nicht leeren Ordner zu löschen, wird der Fehler "Zugriff verweigert" angezeigt. Ich habe bei meinem Versuch den folgenden Befehl verwendet : os.remove("/folder_name")
.
Was ist der effektivste Weg, um einen Ordner / ein Verzeichnis zu entfernen / löschen, der nicht leer ist?
rm -rf
Verhalten siehe: stackoverflow.com/questions/814167/…Antworten:
Standardbibliotheksreferenz: shutil.rmtree .
Schlägt
rmtree
standardmäßig in Ordnerbäumen fehl, die schreibgeschützte Dateien enthalten. Wenn Sie möchten, dass der Ordner gelöscht wird, unabhängig davon, ob er schreibgeschützte Dateien enthält, verwenden Siequelle
rmtree
fehlschlagen wird, wenn schreibgeschützte Dateien vorhanden sind: stackoverflow.com/questions/2656322/…Von dem Python - docs auf
os.walk()
:quelle
quelle
ignore_errors=True
löst das Problem.onerror
Parameter anstelle von verwendetignore_errors
. Auf diese Weise werden schreibgeschützte Dateien gelöscht und nicht ignoriert.rmtree()
Methode ignoriert.Ab Python 3.4 können Sie Folgendes verwenden:
Wo
pth
ist einepathlib.Path
Instanz? Schön, aber vielleicht nicht der schnellste.quelle
Von docs.python.org :
quelle
Wenn ignore_errors gesetzt ist, werden Fehler ignoriert. Wenn onerror gesetzt ist, wird es aufgerufen, um den Fehler mit Argumenten (func, path, exc_info) zu behandeln, wobei func os.listdir, os.remove oder os.rmdir ist. Pfad ist das Argument für diese Funktion, die zum Fehlschlagen geführt hat. und exc_info ist ein Tupel, das von sys.exc_info () zurückgegeben wird. Wenn ignore_errors false und onerror None ist, wird hier eine Ausnahme ausgelöst. Geben Sie Code ein
quelle
Überprüfen Sie anhand der Antwort von kkubasik, ob der Ordner vorhanden ist, bevor Sie ihn entfernen
quelle
try
entfernen und zu verarbeiten,except
als sieexists()
zuerstWenn Sie sicher sind, dass Sie den gesamten Verzeichnisbaum löschen möchten und sich nicht mehr für den Inhalt von dir interessieren, ist es dumm, nach dem gesamten Verzeichnisbaum zu kriechen. Rufen Sie dazu einfach den nativen Betriebssystembefehl von Python auf. Es wird schneller, effizienter und weniger speicherintensiv sein.
oder * nix
In Python sieht der Code wie folgt aus:
quelle
shutil.rmdir
ist, Sie von der Art des Betriebssystems zu isolieren.Nur einige Python 3.5-Optionen, um die obigen Antworten zu vervollständigen. (Ich hätte sie gerne hier gefunden).
Ordner löschen, wenn leer
Löschen Sie auch den Ordner, wenn er diese Datei enthält
Ordner löschen, wenn er nur .srt- oder .txt-Dateien enthält
Ordner löschen, wenn seine Größe weniger als 400 KB beträgt:
quelle
if files[0]== "desktop.ini" or:
Ich möchte einen "reinen Pathlib" -Ansatz hinzufügen:
Dies beruht auf der Tatsache, dass
Path
es ordentlich ist und längere Pfade immer nach kürzeren Pfaden sortieren, genau wiestr
. Daher werden Verzeichnisse vor Dateien stehen. Wenn wir umkehren die Sortierung , werden die Dateien vor ihren jeweiligen Containern angezeigt, sodass wir sie einfach einzeln mit einem Durchgang trennen / rmdiren können.Leistungen:
pathlib
verspricht dies in Python 3.6; kein oben angegebener Vorgang soll nicht unter Windows ausgeführt werden)quelle
quelle
Wenn Sie das
shutil
Modul nicht verwenden möchten, können Sie es einfach verwendenos
.quelle
os.remove
Verzeichnisse können nicht entfernt werden, daher wird dies ausgelöst,OsError
wenndirectoryToRemove
Unterverzeichnisse enthalten sind.Zehn Jahre später und unter Verwendung von Python 3.7 und Linux gibt es noch verschiedene Möglichkeiten, dies zu tun:
Im Wesentlichen wird das Unterprozessmodul von Python verwendet, um das Bash-Skript
$ rm -rf '/path/to/your/dir
so auszuführen, als würden Sie das Terminal verwenden, um dieselbe Aufgabe auszuführen . Es ist nicht vollständig Python, aber es schafft es.Der Grund, warum ich das
pathlib.Path
Beispiel aufgenommen habe, ist, dass es meiner Erfahrung nach sehr nützlich ist, wenn es um viele Pfade geht, die sich ändern. Die zusätzlichen Schritte zum Importieren despathlib.Path
Moduls und zum Konvertieren der Endergebnisse in Zeichenfolgen sind für mich oft weniger Kosten für die Entwicklungszeit. Es wäre praktisch, wenn SiePath.rmdir()
eine arg-Option hätten, um nicht leere Verzeichnisse explizit zu behandeln.quelle
rmtree
und versteckte Ordner wie gestoßen bin.vscode
. Dieser Ordner wurde als Textdatei erkannt und der Fehler sagte mir, dass diese Dateibusy
gelöscht wurde und nicht gelöscht werden konnte.So löschen Sie einen Ordner, auch wenn er möglicherweise nicht vorhanden ist (Vermeidung der Race-Bedingung in Charles Chows Antwort ), aber dennoch Fehler, wenn andere Fehler auftreten (z. B. Berechtigungsprobleme, Fehler beim Lesen der Festplatte, die Datei ist kein Verzeichnis)
Für Python 3.x:
Der Python 2.7-Code ist fast der gleiche:
quelle
Mit os.walk würde ich die Lösung vorschlagen, die aus 3 einzeiligen Python-Aufrufen besteht:
Das erste Skript chmod enthält alle Unterverzeichnisse, das zweite Skript chmod enthält alle Dateien. Dann entfernt das dritte Skript alles ohne Hindernisse.
Ich habe dies anhand des "Shell-Skripts" in einem Jenkins-Job getestet (ich wollte kein neues Python-Skript in SCM speichern, deshalb wurde nach einer einzeiligen Lösung gesucht) und es funktionierte für Linux und Windows.
quelle
pathlib
können Sie die ersten beiden Schritte zu einem kombinieren:[p.chmod(0o666) for p in pathlib.Path(_path_).glob("**/*")]
Der Einfachheit halber können Sie den Befehl os.system verwenden:
Es ist offensichtlich, dass das Systemterminal aufgerufen wird, um diese Aufgabe auszuführen.
quelle
Ich habe eine sehr einfache Möglichkeit gefunden, einen Ordner (auch NICHT leer) oder eine Datei unter WINDOWS OS zu löschen .
quelle
Für Windows, wenn das Verzeichnis nicht leer ist und Sie schreibgeschützte Dateien haben oder Fehler wie erhalten
Access is denied
The process cannot access the file because it is being used by another process
Versuche dies,
os.system('rmdir /S /Q "{}"'.format(directory))
Es ist gleichbedeutend
rm -rf
mit Linux / Mac.quelle