Ответ 1
Попробуйте shutil.rmtree
:
import shutil
shutil.rmtree('/path/to/your/dir/')
У меня проблема с удалением пустых каталогов. Вот мой код:
for dirpath, dirnames, filenames in os.walk(dir_to_search):
//other codes
try:
os.rmdir(dirpath)
except OSError as ex:
print(ex)
Аргумент dir_to_search
- это то, где я dir_to_search
каталог, в котором должна быть выполнена работа. Этот каталог выглядит так:
test/20/...
test/22/...
test/25/...
test/26/...
Обратите внимание, что все вышеперечисленные папки пусты. Когда я запускаю этот скрипт, только папки 20
, 25
удаляются! Но папки 25
и 26
не удаляются, даже если они являются пустыми папками.
Исключение, которое я получаю:
[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'
Где я делаю ошибку?
Попробуйте shutil.rmtree
:
import shutil
shutil.rmtree('/path/to/your/dir/')
Поведение os.walk()
по умолчанию - это переход от корня к листу. Установите topdown=False
в os.walk()
, чтобы перейти от листа к корню.
Попробуйте rmtree в shutil. в библиотеке python std
Немного опоздали на шоу, но вот мой чистый Pathlib рекурсивного каталог unlinker
def rmdir(dir):
dir = Path(dir)
for item in dir.iterdir():
if item.is_dir():
rmdir(item)
else:
item.unlink()
dir.rmdir()
rmdir(pathlib.Path("dir/"))
лучше использовать абсолютный путь и импортировать только функцию rmtree
from shutil import rmtree
поскольку это большой пакет, указанная выше строка будет импортировать только требуемую функцию.
from shutil import rmtree
rmtree('directory-absolute-path')
Просто для следующего парня, который ищет решение для микропифона, это работает исключительно на основе os (listdir, remove, rmdir). Он не является ни полным (особенно в обработке ошибок), ни причудливым, однако он будет работать в большинстве случаев.
def deltree(target):
print("deltree", target)
for d in os.listdir(target):
try:
deltree(target + '/' + d)
except OSError:
os.remove(target + '/' + d)
os.rmdir(target)
Команда (данная Tomek) не может удалить файл, если он только для чтения. следовательно, можно использовать -
import os, sys
import stat
def del_evenReadonly(action, name, exc):
os.chmod(name, stat.S_IWRITE)
os.remove(name)
if os.path.exists("test/qt_env"):
shutil.rmtree('test/qt_env',onerror=del_evenReadonly)
Вот рекурсивное решение:
def clear_folder(dir):
if os.path.exists(dir):
for the_file in os.listdir(dir):
file_path = os.path.join(dir, the_file)
try:
if os.path.isfile(file_path):
os.unlink(file_path)
else:
clear_folder(file_path)
os.rmdir(file_path)
except Exception as e:
print(e)
Вот еще одно решение с чистым путем, но без рекурсии:
from pathlib import Path
from typing import Union
def del_empty_dirs(base: Union[Path, str]):
base = Path(base)
for p in sorted(base.glob('**/*'), reverse=True):
if p.is_dir():
p.chmod(0o666)
p.rmdir()
else:
raise RuntimeError(f'{p.parent} is not empty!')
base.rmdir()
path = "C:\\Personal"
ls = [x[0] for x in os.walk(path)][::-1]
for i in ls:
if os.path.isdir(i):
if not os.listdir(i):
os.rmdir(i)