我想在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)
经过更多调查,以下方法似乎有效:
def del_rw(action, name, exc):
os.chmod(name, stat.S_IWRITE)
os.remove(name)
shutil.rmtree(path, onerror=del_rw)
也就是说,在onerror函数中实际删除该文件。 (您可能需要检查 onerror 处理程序中的目录,并在这种情况下使用 rmdir - 我不需要它,但它可能只是关于我的问题的特定内容。
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
您可以采用快速而肮脏的方法并执行
subprocess.check_call(["rm", "-rf", filename])
。但可能无法在 Windows 上运行。