python - 目录 - 在python中递归地删除文件夹

删除空目录时出现问题,这是我的代码:


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是我传递工作需要完成的目录的地方,目录如下所示:


test/20/...


test/22/...


test/25/...


test/26/...



请注意,上所有文件夹都是空的,运行此脚本时,只删除文件夹2025!但是,文件夹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()的默认行为是从根到叶子,在os.walk()中设置topdown=False以从叶子到根。

在shutil中尝试rmtree。在python std库中

这个是我的纯pathlib递归目录删除,


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')



它既不是完全的(尤其是在处理错误方面)也不是花哨的,它在大多数情况下都能工作。


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)



因此,可以使用-


import os, sys


from stat import *



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)



这个是另一个纯pathlib解决方案,但是没有递归:


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()



...