我想在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)
答案 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