Podczas próby usunięcia folderu, który nie jest pusty, pojawia się błąd „odmowa dostępu”. Użyłem następującego polecenia w moim próba: os.remove("/folder_name")
.
Jaki jest najskuteczniejszy sposób usuwania / usuwania folderu / katalogu, który nie jest pusty?
rm -rf
Odpowiedzi:
Odwołanie do biblioteki standardowej: shutil.rmtree .
Z założenia
rmtree
zawodzi w drzewach folderów zawierających pliki tylko do odczytu. Jeśli chcesz usunąć folder bez względu na to, czy zawiera on pliki tylko do odczytu, użyjźródło
rmtree
zakończy się niepowodzeniem, jeśli istnieją pliki tylko do odczytu: stackoverflow.com/questions/2656322/…Od docs Pythona na
os.walk()
:źródło
źródło
ignore_errors=True
rozwiązuje problem.onerror
parametr jest używany zamiastignore_errors
. W ten sposób pliki tylko do odczytu są usuwane, a nie ignorowane.rmtree()
metoda jest ignorowana.z Pythona 3.4 możesz użyć:
gdzie
pth
jestpathlib.Path
instancja. Fajnie, ale może nie być najszybszy.źródło
Z docs.python.org :
źródło
Jeśli ustawione jest ignore_errors, błędy są ignorowane; w przeciwnym razie, jeśli ustawiony jest onerror, wywoływany jest do obsługi błędu z argumentami (func, path, exc_info), gdzie func to os.listdir, os.remove lub os.rmdir; ścieżka jest argumentem tej funkcji, która spowodowała jej awarię; a exc_info to krotka zwrócona przez sys.exc_info (). Jeśli ignore_errors ma wartość false, a onerror ma wartość None, zgłaszany jest wyjątek. Wprowadź kod tutaj
źródło
Oprzyj się na odpowiedzi kkubasika, sprawdź, czy folder istnieje przed usunięciem, bardziej solidny
źródło
try
usunąć i obsłużyćexcept
niżexists()
najpierw zadzwonićjeśli jesteś pewien, że chcesz usunąć całe drzewo katalogów i nie jesteś już zainteresowany zawartością katalogu, to przeszukiwanie całego drzewa katalogów jest głupotą ... po prostu wywołaj natywną komendę systemu operacyjnego z python, aby to zrobić. Będzie szybszy, wydajniejszy i zużywa mniej pamięci.
lub * nix
W pythonie kod będzie wyglądał jak ...
źródło
shutil.rmdir
to, aby odizolować Cię od rodzaju systemu operacyjnego.Tylko niektóre opcje Pythona do uzupełnienia powyższych odpowiedzi. (Chciałbym je tutaj znaleźć).
Usuń folder, jeśli jest pusty
Usuń także folder, jeśli zawiera ten plik
usuń folder, jeśli zawiera tylko pliki .srt lub .txt
Usuń folder, jeśli jego rozmiar jest mniejszy niż 400 KB:
źródło
if files[0]== "desktop.ini" or:
Chciałbym dodać podejście „czystej ścieżki”:
Zależy to od tego, że
Path
jest uporządkowane, a dłuższe ścieżki zawsze będą sortować po krótszych ścieżkach, tak jakstr
. Dlatego katalogi pojawią się przed plikami. Jeśli się odwrócimy sortowanie, pliki pojawią się przed ich odpowiednimi kontenerami, więc możemy je po prostu odłączyć / rmdir jeden po drugim za jednym przejściem.Korzyści:
pathlib
obiecuje w Pythonie 3.6; żadna z powyższych operacji nie działa w systemie Windows)źródło
źródło
Jeśli nie chcesz korzystać z
shutil
modułu, możesz po prostu użyćos
modułu.źródło
os.remove
nie można usunąć katalogów, więc spowoduje to wzrost,OsError
jeślidirectoryToRemove
zawiera podkatalogi.Dziesięć lat później i przy użyciu Pythona 3.7 i Linuksa istnieją jeszcze różne sposoby:
Zasadniczo używa modułu podprocesu Pythona do uruchamiania skryptu bash,
$ rm -rf '/path/to/your/dir
tak jakbyś używał terminala do wykonania tego samego zadania. To nie jest w pełni Python, ale robi to.Podałem
pathlib.Path
przykład, ponieważ z mojego doświadczenia wynika, że jest bardzo przydatny, gdy mamy do czynienia z wieloma zmieniającymi się ścieżkami. Dodatkowe etapy importowaniapathlib.Path
modułu i konwertowania wyników końcowych na ciągi są często dla mnie niższym kosztem czasu programowania. Byłoby wygodne, gdybyPath.rmdir()
był wyposażony w opcję arg do jawnej obsługi niepustych katalogów.źródło
rmtree
ukrytymi folderami takimi jak.vscode
. Ten folder został wykryty jako plik tekstowy, a błąd powiedział mi, że ten plik zostałbusy
i nie można go usunąć.Aby usunąć folder, nawet jeśli nie istnieje (unikając warunków wyścigu w odpowiedzi Charlesa Chowa ), ale nadal występują błędy, gdy inne rzeczy idą źle (np. Problemy z uprawnieniami, błąd odczytu dysku, plik nie jest katalogiem)
W przypadku Python 3.x:
Kod Python 2.7 jest prawie taki sam:
źródło
W przypadku os.walk zaproponowałbym rozwiązanie składające się z 3 jedno-liniowych wywołań Pythona:
Pierwszy skrypt chmod ma wszystkie podkatalogi, drugi skrypt chmod ma wszystkie pliki. Następnie trzeci skrypt usuwa wszystko bez przeszkód.
Przetestowałem to z poziomu „Skryptu powłoki” w zadaniu Jenkinsa (nie chciałem przechowywać nowego skryptu Python w SCM, dlatego szukałem rozwiązania jednowierszowego) i działało to w systemach Linux i Windows.
źródło
pathlib
możesz połączyć dwa pierwsze kroki w jeden:[p.chmod(0o666) for p in pathlib.Path(_path_).glob("**/*")]
Dla uproszczenia możesz użyć polecenia os.system:
Jak oczywiste, faktycznie wykonuje terminal systemowy, aby wykonać to zadanie.
źródło
Znalazłem bardzo łatwy sposób na usunięcie dowolnego folderu (nawet NIE pustego) lub pliku w systemie operacyjnym WINDOWS .
źródło
W systemie Windows, jeśli katalog nie jest pusty i masz pliki tylko do odczytu lub występują błędy takie jak
Access is denied
The process cannot access the file because it is being used by another process
Spróbuj tego,
os.system('rmdir /S /Q "{}"'.format(directory))
Jest to odpowiednik
rm -rf
w systemach Linux / Mac.źródło