shutil.rmtree删除只读文件

时间:2014-01-21 14:38:29

标签: python shutil

我想在Python中使用shutil.rmtree来删除目录。有问题的目录包含一个.git控制目录,git标记为只读和隐藏。

只读标志导致rmtree失败。在Powershell中,我会“强制”强制删除只读标志。 Python中有相应的东西吗?我真的不想两次走遍整个树,但rmtree的onerror参数似乎没有重试该操作,所以我不能使用

def set_rw(operation, name, exc):
    os.chmod(name, stat.S_IWRITE)

shutil.rmtree('path', onerror=set_rw)

2 个答案:

答案 0 :(得分:25)

经过更多调查后,以下情况似乎有效:

def del_rw(action, name, exc):
    os.chmod(name, stat.S_IWRITE)
    os.remove(name)
shutil.rmtree(path, onerror=del_rw)

换句话说,实际上删除了onerror函数中的文件。 (您可能需要在onerror处理程序中检查目录并在这种情况下使用rmdir - 我不需要它,但它可能只是我的问题的具体内容。

答案 1 :(得分:0)

shutil.rmtree 用于删除非空目录(移除树)。


    import os
    import stat
    import shutil
    def del_ro_dir(dir_name):
        '''Remove Read Only Directories'''
        for (root, dirs, files) in os.walk(dir_name, topdown=True):
            os.chmod(root,
                # For user ...
                stat.S_IRUSR |
                stat.S_IWUSR |
                stat.S_IXUSR |
                # For group ...
                stat.S_IWGRP |
                stat.S_IRGRP |
                stat.S_IXGRP |
                # For other ...
                stat.S_IROTH |
                stat.S_IWOTH |
                stat.S_IXOTH
            )
        shutil.rmtree(dir_name)

    if __name__ == '__main__':
        del_ro_dir('dir_name_here')

要仅删除文件,可以使用以下代码:


    import os
    import stat
    def rmv_rof(file_name):
        '''Remov Read Only Files'''
        if os.path.exists(file_name):
            os.chmod(file_name, stat.S_IWRITE)
            os.remove(file_name)
        else:
            print('The file does not exist.')
    rmv_rof('file_name_here')

您可以在此处阅读详细信息:

https://docs.python.org/3/library/os.html#os.chmod

https://docs.python.org/3/library/stat.html#module-stat

https://docs.python.org/3/library/shutil.html#rmtree-example