删除python上不为空的目录
所以,我需要清理一个不是空的目录。 我创建了以下函数。出于测试原因,我尝试删除JDK安装删除python上不为空的目录,python,delete-file,Python,Delete File,所以,我需要清理一个不是空的目录。 我创建了以下函数。出于测试原因,我尝试删除JDK安装 def clean_dir(location): fileList = os.listdir(location) for fileName in fileList: fullpath=os.path.join(location, fileName) if os.path.isfile(fullpath): os.chmod(fullp
def clean_dir(location):
fileList = os.listdir(location)
for fileName in fileList:
fullpath=os.path.join(location, fileName)
if os.path.isfile(fullpath):
os.chmod(fullpath, stat.S_IRWXU | stat.S_IRWXG | stat.S_IRWXO)
os.remove(location + "/" + fileName)
elif os.path.isdir(fullpath):
if len(os.listdir(fullpath)) > 0:
clean_dir(fullpath)
#os.rmdir(location + "/" + fileName)
shutil.rmtree(location + "/" + fileName)
return
我尝试使用rmtree和rmdir,但失败了
我使用rmtree得到的错误是:
OSError:无法在符号链接上调用rmtree
这就是我在使用rmdir时遇到的错误:
OSError:[Errno 66]目录不为空:
“/tmp/jdk1.8.0_25/jre/lib/amd64/server”
该代码在windows上正常工作。但由于某些原因,它在linux上失败。您遇到了Windows和linux(UNIX)处理文件系统的方式之间的差异之一。我相信在代码中添加一个额外的案例至少会有帮助:
...
for fileName in fileList:
fullpath = os.path.join(location, fileName)
## |<-- Handle symlink -->|
if os.path.islink(fullpath) or os.path.isfile(fullpath):
os.chmod(fullpath, stat.S_IRWXU | stat.S_IRWXG | stat.S_IRWXO)
os.remove(os.path.join(location, fileName))
elif os.path.isdir(fullpath):
if len(os.listdir(fullpath)) > 0:
clean_dir(fullpath)
#os.rmdir(os.path.join(location, fileName))
shutil.rmtree(os.path.join(location, fileName))
...
。。。
对于文件列表中的文件名:
fullpath=os.path.join(位置、文件名)
## ||
如果os.path.islink(完整路径)或os.path.isfile(完整路径):
os.chmod(完整路径,stat.S|u IRWXU | stat.S_IRWXG | stat.S_IRWXO)
删除(os.path.join(位置、文件名))
elif os.path.isdir(完整路径):
如果len(os.listdir(fullpath))>0:
清理目录(完整路径)
#os.rmdir(os.path.join(位置、文件名))
rmtree(os.path.join(位置、文件名))
...
这应该正确处理条目是符号链接的情况,并像删除文件一样删除它。我不确定chmod
是否必要-它可能在链接的目标上工作,但以与文件相同的方式处理它应该不会有什么坏处
但是,我刚刚对符号链接进行了检查,并且
os.path.file
返回指向的“对象”的类型,因此需要额外的检查来区分链接本身和指向的对象。另外,为了便于移植,不要像上面新编辑的那样添加“/”useos.path.join
。您遇到了Windows和Linux(UNIX)处理文件系统的方式之间的差异之一。我相信在代码中添加一个额外的案例至少会有帮助:
...
for fileName in fileList:
fullpath = os.path.join(location, fileName)
## |<-- Handle symlink -->|
if os.path.islink(fullpath) or os.path.isfile(fullpath):
os.chmod(fullpath, stat.S_IRWXU | stat.S_IRWXG | stat.S_IRWXO)
os.remove(os.path.join(location, fileName))
elif os.path.isdir(fullpath):
if len(os.listdir(fullpath)) > 0:
clean_dir(fullpath)
#os.rmdir(os.path.join(location, fileName))
shutil.rmtree(os.path.join(location, fileName))
...
。。。
对于文件列表中的文件名:
fullpath=os.path.join(位置、文件名)
## ||
如果os.path.islink(完整路径)或os.path.isfile(完整路径):
os.chmod(完整路径,stat.S|u IRWXU | stat.S_IRWXG | stat.S_IRWXO)
删除(os.path.join(位置、文件名))
elif os.path.isdir(完整路径):
如果len(os.listdir(fullpath))>0:
清理目录(完整路径)
#os.rmdir(os.path.join(位置,文件名))
rmtree(os.path.join(位置、文件名))
...
这应该正确处理条目是符号链接的情况,并像删除文件一样删除它。我不确定chmod
是否必要-它可能在链接的目标上工作,但以与文件相同的方式处理它应该不会有什么坏处
但是,我刚刚对符号链接进行了检查,并且
os.path.file
返回指向的“对象”的类型,因此需要额外的检查来区分链接本身和指向的对象。也为了便于移植,而不是像上面新编辑的那样添加“/”useos.path.join
。kronenpj谢谢,这就是想法。但是,当您有一个符号链接时,它会尝试将其作为普通文件删除,并失败。我必须添加一个新的elif并为符号链接添加取消链接选项
kronenpj谢谢,就是这个主意。但是,当您有一个符号链接时,它会尝试将其作为普通文件删除,并失败。我必须添加一个新的elif并为符号链接添加取消链接选项
您将rmtree指向的是符号链接,而不是目录。如果它是一个符号链接,我认为
os.unlink(…)
就是您所需要的。(为了澄清,这只会删除符号链接。它不会删除符号链接指向的任何内容。)IIRC,os.unlink
也应该删除文件。您将rmtree指向的是符号链接,而不是目录。如果它是一个符号链接,我认为os.unlink(…)
就是您所需要的。(为了澄清,这只会删除符号链接。它不会删除符号链接指向的任何内容。)IIRC,os.unlink
也应该删除文件。绝对正确,我不确定remove()
是否能正确处理符号链接。绝对正确,我不确定remove()是否正确
是否正确处理符号链接。