Mam problem z usunięciem pustych katalogów. Oto mój kod:
for dirpath, dirnames, filenames in os.walk(dir_to_search):
//other codes
try:
os.rmdir(dirpath)
except OSError as ex:
print(ex)
Argument dir_to_search
polega na tym, że przekazuję katalog, w którym należy wykonać pracę. Ten katalog wygląda następująco:
test/20/...
test/22/...
test/25/...
test/26/...
Pamiętaj, że wszystkie powyższe foldery są puste. Kiedy uruchomić ten skrypt foldery 20
, 25
sam zostaje usunięte! Ale foldery 25
i 26
nie są usuwane, nawet jeśli są pustymi folderami.
Edytować:
Wyjątek, który otrzymuję to:
[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'
Gdzie popełniam błąd?
rmdir /path/to/25th/folder
usuwa cały katalog. Co oznacza, że katalog jest pusty!Odpowiedzi:
Spróbuj
shutil.rmtree
:źródło
rmtree
usunięto cały katalog?rm -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))
Domyślnym zachowaniem
os.walk()
jest przejście od korzenia do liścia. Ustawtopdown=False
wos.walk()
chodzić z liści do korzenia.źródło
Oto mój czysty
pathlib
rekurencyjny program do usuwania katalogu:źródło
Spróbuj
rmtree()
sięshutil
ze standardowej biblioteki Pythonaźródło
rmtree
usunięto cały katalog?rm -Rf $DIR
lepiej użyć ścieżki bezwzględnej i zaimportować tylko funkcję rmtree,
from shutil import rmtree
ponieważ jest to duży pakiet, powyższa linia zaimportuje tylko wymaganą funkcję.źródło
rmtree()
; nieshutil.rmtree()
Tylko dla następnego faceta szukającego rozwiązania mikrofytonowego działa to wyłącznie w oparciu o os (listdir, remove, rmdir). Nie jest ani kompletny (zwłaszcza w obsłudze błędów), ani wymyślny, jednak w większości przypadków będzie działał.
źródło
Polecenie (wydane przez Tomka) nie może usunąć pliku, jeśli jest tylko do odczytu . dlatego można użyć -
źródło
NameError: name 'stat' is not defined
. Jak to zostało zdefiniowane?Oto inne rozwiązanie z czystą ścieżką , ale bez rekurencji:
źródło
Oto rozwiązanie rekurencyjne:
źródło
Użytkownicy systemu Linux mogą po prostu uruchomić polecenie powłoki w sposób pythonowy
gdzie
rm
oznacza Usuń i-r
dla rekurencyjnieźródło