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?

2voto

Eponymous Punkte 5001

Um einen Ordner zu löschen, auch wenn er möglicherweise nicht existiert (und damit die Race Condition in Charles Chow's Antwort ), aber immer noch Fehler haben, wenn andere Dinge schief gehen (z. B. Probleme mit der Berechtigung, Fehler beim Lesen der Festplatte, die Datei ist kein Verzeichnis)

Für Python 3.x:

import shutil

def ignore_absent_file(func, path, exc_inf):
    except_instance = exc_inf[1]
    if isinstance(except_instance, FileNotFoundError):
        return
    raise except_instance

shutil.rmtree(dir_to_delete, onerror=ignore_absent_file)

Der Code von Python 2.7 ist fast identisch:

import shutil
import errno

def ignore_absent_file(func, path, exc_inf):
    except_instance = exc_inf[1]
    if isinstance(except_instance, OSError) and \
        except_instance.errno == errno.ENOENT:
        return
    raise except_instance

shutil.rmtree(dir_to_delete, onerror=ignore_absent_file)

2voto

Kartik Raj Punkte 142

Unter Windows, wenn das Verzeichnis nicht leer ist und Sie schreibgeschützte Dateien haben oder Sie Fehler erhalten wie

  • Access is denied
  • The process cannot access the file because it is being used by another process

Versuchen Sie dies, os.system('rmdir /S /Q "{}"'.format(directory))

Es ist gleichbedeutend für rm -rf unter Linux/Mac.

1voto

Alexander Samoylov Punkte 1800

Mit os.walk würde ich die Lösung vorschlagen, die aus 3 einzeiligen Python-Aufrufen besteht:

python -c "import sys; import os; [os.chmod(os.path.join(rs,d), 0o777) for rs,ds,fs in os.walk(_path_) for d in ds]"
python -c "import sys; import os; [os.chmod(os.path.join(rs,f), 0o777) for rs,ds,fs in os.walk(_path_) for f in fs]"
python -c "import os; import shutil; shutil.rmtree(_path_, ignore_errors=False)"

Das erste Skript chmodiert alle Unterverzeichnisse, das zweite Skript chmodiert alle Dateien. Dann entfernt das dritte Skript alles ohne Hindernisse.

Ich habe dies aus dem "Shell-Skript" in einem Jenkins-Job getestet (ich wollte nicht ein neues Python-Skript in SCM speichern, deshalb suchte ich nach einer einzeiligen Lösung) und es funktionierte für Linux und Windows.

0voto

seremet Punkte 145

Ich habe eine sehr einfache Möglichkeit gefunden, jede Ordner(Auch NICHT leer) oder Datei auf Windows-Betriebssystem .

os.system('powershell.exe  rmdir -r D:\workspace\Branches\*%s* -Force' %CANDIDATE_BRANCH)

0voto

Paulo Guimarães Punkte 382

In meinem Fall konnte ich nur löschen, indem ich alle Möglichkeiten nutzte, da mein Code entweder über cmd.exe oder powershell.exe ausgeführt werden sollte. Wenn dies bei Ihnen der Fall ist, erstellen Sie einfach eine Funktion mit diesem Code, und Sie werden gut sein:

        #!/usr/bin/env python3

        import shutil
        from os import path, system
        import sys

        # Try to delete the folder ---------------------------------------------
        if (path.isdir(folder)):
            shutil.rmtree(folder, ignore_errors=True)

        if (path.isdir(folder)):
            try:
                system("rd -r {0}".format(folder))
            except Exception as e:
                print("WARN: Failed to delete => {0}".format(e),file=sys.stderr)

        if (path.isdir(self.backup_folder_wrk)):
            try:
                system("rd /s /q {0}".format(folder))
            except Exception as e:
                print("WARN: Failed to delete => {0}".format(e),file=sys.stderr)

        if (path.isdir(folder)):
            print("WARN: Failed to delete {0}".format(folder),file=sys.stderr)
        # -------------------------------------------------------------------------------------

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