shutil.rmtree to remove readonly files shutil.rmtree to remove readonly files python python

shutil.rmtree to remove readonly files


After more investigation, the following appears to work:

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

In other words, actually remove the file in the onerror function. (You might need to check for a directory in the onerror handler and use rmdir in that case - I didn't need that but it may just be something specific about my problem.


shutil.rmtree is used to delete directories that are not empty (remove tree).

    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')

To delete a file only, you can use the following code:

    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')

You can read detailed information 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


You could just go with the quick-and-dirty method and do subprocess.check_call(["rm", "-rf", filename]). Likely won't work on Windows though.