1114 Stimmen

Wie entferne/lösche ich einen Ordner, der nicht leer ist?

Ich erhalte die Fehlermeldung "Zugriff verweigert", wenn ich versuche, einen Ordner zu löschen, der nicht leer ist. Ich habe bei meinem Versuch den folgenden Befehl verwendet: os.remove("/folder_name") .

Wie lässt sich ein Ordner/Verzeichnis, das nicht leer ist, am effektivsten entfernen/löschen?

6voto

RodogInfinite Punkte 61

Zehn Jahre später und mit Python 3.7 und Linux gibt es immer noch verschiedene Möglichkeiten, dies zu tun:

import subprocess
from pathlib import Path

#using pathlib.Path
path = Path('/path/to/your/dir')
subprocess.run(["rm", "-rf", str(path)])

#using strings
path = "/path/to/your/dir"
subprocess.run(["rm", "-rf", path])

Im Wesentlichen wird das Bash-Skript mit Hilfe des Python-Moduls subprocess ausgeführt $ rm -rf '/path/to/your/dir als würden Sie das Terminal verwenden, um die gleiche Aufgabe zu erledigen. Es ist nicht ganz Python, aber es erledigt die Aufgabe.

Der Grund, warum ich die pathlib.Path Beispiel ist, weil es meiner Erfahrung nach sehr nützlich ist, wenn man mit vielen Pfaden zu tun hat, die sich ändern. Die zusätzlichen Schritte zum Importieren der pathlib.Path Modul und die Konvertierung der Endergebnisse in Strings ist für mich oft ein geringerer Kostenfaktor für die Entwicklungszeit. Es wäre praktisch, wenn Path.rmdir() wurde mit einer arg-Option ausgestattet, um nicht-leere Verzeichnisse explizit zu behandeln.

4voto

Gustavo Bezerra Punkte 8388

Rekursionsbasiert, rein pathlib Lösung:

from pathlib import Path

def remove_path(path: Path):
    if path.is_file() or path.is_symlink():
        path.unlink()
        return
    for p in path.iterdir():
        remove_path(p)
    path.rmdir()

Unterstützt Windows und symbolische Links

3voto

amazingthere Punkte 922
def deleteDir(dirPath):
    deleteFiles = []
    deleteDirs = []
    for root, dirs, files in os.walk(dirPath):
        for f in files:
            deleteFiles.append(os.path.join(root, f))
        for d in dirs:
            deleteDirs.append(os.path.join(root, d))
    for f in deleteFiles:
        os.remove(f)
    for d in deleteDirs:
        os.rmdir(d)
    os.rmdir(dirPath)

2voto

Der Einfachheit halber können Sie den Befehl os.system verwenden:

import os
os.system("rm -rf dirname")

Es ist offensichtlich, dass es das Systemterminal aufruft, um diese Aufgabe zu erfüllen.

2voto

Byron Filer Punkte 713

Wenn Sie nicht die shutil Modul können Sie einfach die os Modul.

from os import listdir, rmdir, remove
for i in listdir(directoryToRemove):
    os.remove(os.path.join(directoryToRemove, i))
rmdir(directoryToRemove) # Now the directory is empty of files

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X