使用shutil.rmtree删除文件夹内容后仍触发[WinError 5]访问拒绝异常
解决shutil.rmtree删除文件夹时的WinError 5访问拒绝问题
调用shutil.rmtree()时,即便文件夹内容已被清空,但删除文件夹本身时抛出[WinError 5] Access is denied异常,常见原因有两个:
- 目标文件夹被其他进程占用(比如资源管理器正打开该文件夹、杀毒软件正在后台扫描)
- 文件夹或其内容带有只读属性,当前用户权限不足无法删除文件夹本身
解决方法
1. 关闭占用文件夹的进程
先检查并关闭所有可能访问该文件夹的程序(比如对应资源管理器窗口、打开该文件夹的编辑器、杀毒软件实时扫描),再重新运行删除代码。
2. 自定义错误处理函数,强制修改权限后删除
通过rmtree的onerror参数传入回调函数,遇到权限问题时自动修改文件/文件夹权限,再重试删除:
from shutil import rmtree import os import stat def handle_readonly_error(func, path, exc_info): # 移除只读属性,赋予写入权限 os.chmod(path, stat.S_IWRITE) # 重新执行原删除操作 func(path) my_folder = 'aaa/bbb/' try: rmtree(my_folder, onerror=handle_readonly_error) except Exception as err: print(err)
3. 手动逐层删除内容后再删空文件夹
如果上述方法无效,可以手动遍历文件夹,先删除所有文件和子文件夹,最后删除空的目标文件夹:
import os import stat my_folder = 'aaa/bbb/' # 从最底层开始删除文件和子文件夹 for root, dirs, files in os.walk(my_folder, topdown=False): # 删除文件 for file_name in files: file_path = os.path.join(root, file_name) os.chmod(file_path, stat.S_IWRITE) os.remove(file_path) # 删除子文件夹 for dir_name in dirs: dir_path = os.path.join(root, dir_name) os.chmod(dir_path, stat.S_IWRITE) os.rmdir(dir_path) # 最后删除空的目标文件夹 try: os.rmdir(my_folder) except Exception as err: print(err)
内容的提问来源于stack exchange,提问作者eltal
相关产品推荐
相关产品推荐

