shutil.rmtree 删除只读文件

问题描述 投票:0回答:3

我想在Python中使用

shutil.rmtree
来删除目录。有问题的目录包含一个
.git
控制目录,git 将其标记为只读和隐藏。

只读标志会导致

rmtree
失败。在 Powershell 中,我会执行“del -force”来强制删除只读标志。 Python 中有等效的吗?我真的不想将整个树遍历两次,但是 rmtree 的
onerror
参数似乎不会重试该操作,所以我不能使用

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

shutil.rmtree('path', onerror=set_rw)
python shutil
3个回答
43
投票

经过更多调查,以下方法似乎有效:

def del_rw(action, name, exc):
    os.chmod(name, stat.S_IWRITE)
    os.remove(name)

shutil.rmtree(path, onerror=del_rw)

也就是说,在onerror函数中实际删除该文件。 (您可能需要检查 onerror 处理程序中的目录,并在这种情况下使用 rmdir - 我不需要它,但它可能只是关于我的问题的特定内容。


0
投票

shuutil.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


0
投票

您可以采用快速而肮脏的方法并执行

subprocess.check_call(["rm", "-rf", filename])
。但可能无法在 Windows 上运行。

© www.soinside.com 2019 - 2024. All rights reserved.