删除python上不为空的目录

删除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

所以,我需要清理一个不是空的目录。 我创建了以下函数。出于测试原因,我尝试删除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(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
返回指向的“对象”的类型,因此需要额外的检查来区分链接本身和指向的对象。另外,为了便于移植,不要像上面新编辑的那样添加“/”use
os.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
返回指向的“对象”的类型,因此需要额外的检查来区分链接本身和指向的对象。也为了便于移植,而不是像上面新编辑的那样添加“/”use
os.path.join

kronenpj谢谢,这就是想法。但是,当您有一个符号链接时,它会尝试将其作为普通文件删除,并失败。我必须添加一个新的elif并为符号链接添加取消链接选项


kronenpj谢谢,就是这个主意。但是,当您有一个符号链接时,它会尝试将其作为普通文件删除,并失败。我必须添加一个新的elif并为符号链接添加取消链接选项


您将rmtree指向的是符号链接,而不是目录。如果它是一个符号链接,我认为
os.unlink(…)
就是您所需要的。(为了澄清,这只会删除符号链接。它不会删除符号链接指向的任何内容。)IIRC,
os.unlink
也应该删除文件。您将rmtree指向的是符号链接,而不是目录。如果它是一个符号链接,我认为
os.unlink(…)
就是您所需要的。(为了澄清,这只会删除符号链接。它不会删除符号链接指向的任何内容。)IIRC,
os.unlink
也应该删除文件。绝对正确,我不确定
remove()
是否能正确处理符号链接。绝对正确,我不确定
remove()是否正确
是否正确处理符号链接。