概述
最初删除文件夹的函数如下:
def del_file_or_folder(self, file_path):
if os.path.exists(file_path):
try:
if os.path.isdir(file_path):
shutil.rmtree(file_path)
else:
os.remove(file_path)
except Exception as error:
print(error)
else:
pass
首先判断路径为文件还是文件夹,文件的话调用os.remove(),该方法用于删除指定路径的文件,但若指定的路径是一个目录,将抛出OSError;所以当路径为文件夹时调用shutil.rmtree(),该函数的声明如下:
shutil.rmtree(path, ignore_errors=False, onerror=None)
"""Recursively delete a directory tree.
If ignore_errors is set, errors are ignored; otherwise, if onerror
is set, it is called to handle the error with arguments (func,
path, exc_info) where func is platform and implementation dependent;
path is the argument to that function that caused it to fail; and
exc_info is a tuple returned by sys.exc_info(). If ignore_errors
is false and onerror is None, an exception is raised.
"""
该函数可以递归地删除目录树,当ignore_errors设为True时会忽略错误,onerror则可以调用一个错误处理函数,该处理函数的入参有func,path和exc_info;当ignore_errors为False,onerror为None时将抛出Exception。
在使用shutil.rmtree()时我遇到了两个问题,一是[WinError 145] 目录非空,二是找不到文件。
第一个问题是因为目录中有些文件或文件夹是只读的,程序没有权限去执行删除操作,所以目录中内容没有删干净,解决方法是引入错误处理函数,在操作出错时将文件或文件夹的状态修改为支持写的模式, 修改后代码如下:
def del_file_or_folder(self, file_path):
if os.path.exists(file_path):
try:
if os.path.isdir(file_path):
shutil.rmtree(file_path, onerror=self.readonly_handler)
else:
os.remove(file_path)
except Exception as error:
print(error)
else:
pass
def readonly_handler(self, func, path, exc_info):
os.chmod(path, stat.S_IWRITE)
func(path)
第二个问题是因为路径名过长,超过Windows默认的文件路径长度,修改方法是在file_path前加上“?”告知系统当前文件路径长度,注意此路径需为绝对路径,如:
file_path = r"\?{}".format(cur_path) # cur_path is an absolute path
self.del_file_or_folder(file_path)
最后
以上就是迷你犀牛为你收集整理的删除文件夹时遇到的问题及解决方法 python的全部内容,希望文章能够帮你解决删除文件夹时遇到的问题及解决方法 python所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复