gpt4 book ai didi

python - shutil.rmtree 不适用于 Windows 库

转载 作者:可可西里 更新时间:2023-11-01 13:53:37 27 4
gpt4 key购买 nike

所以我正在构建一个简单的脚本,将某些文档备份到我的第二个硬盘驱动器(你永远不知道会发生什么!)。因此,我使用 shutil.copytree 函数将我的数据复制到第二个驱动器上。它工作得很好,这不是问题。

如果目标已经存在,我使用 shutil.rmtree 函数移除树。我会告诉你我的代码:

import shutil
import os

def overwrite(src, dest):
if(not os.path.exists(src)):
print(src, "does not exist, so nothing may be copied.")
return

if(os.path.exists(dest)):
shutil.rmtree(dest)

shutil.copytree(src, dest)
print(dest, "overwritten with data from", src)
print("")

overwrite(r"C:\Users\Centurion\Dropbox\Documents", r"D:\Backup\Dropbox Documents")
overwrite(r"C:\Users\Centurion\Pictures", r"D:\Backup\All Pictures")

print("Press ENTER to continue...")
input()

如您所见,一个简单的脚本。现在,当我第一次运行脚本时,一切都很好。图片和文档复制到我的 D: 驱动器就好了。但是,当我第二次运行时,这是我的输出:

C:\Users\Centurion\Programming\Python>python cpdocsnpics.py
D:\Backup\Dropbox Documents overwritten with data from C:\Users\Centurion\Dropbox\Documents

Traceback (most recent call last):
File "cpdocsnpics.py", line 17, in <module>
overwrite(r"C:\Users\Centurion\Pictures", r"D:\Backup\All Pictures")
File "cpdocsnpics.py", line 10, in overwrite
shutil.rmtree(dest)
File "C:\Python34\lib\shutil.py", line 477, in rmtree
return _rmtree_unsafe(path, onerror)
File "C:\Python34\lib\shutil.py", line 376, in _rmtree_unsafe
onerror(os.rmdir, path, sys.exc_info())
File "C:\Python34\lib\shutil.py", line 374, in _rmtree_unsafe
os.rmdir(path)
PermissionError: [WinError 5] Access is denied: 'D:\\Backup\\All Pictures'

只有第一次复制Pictures时才会出现这个错误;我假设它与图书馆有关。

我该怎么办?

最佳答案

这是一个跨平台的一致性问题。您已经复制了具有 readonly 属性的文件/目录。第一次 "dest"不存在,因此不执行 rmtree 方法。但是,当您尝试运行“覆盖”功能时,我们会注意到“目标”位置存在(及其子树)但它是通过只读访问权限复制的。所以这里我们遇到了问题。为了“修复”问题,您必须为 shutil.rmtreeonerror 参数提供处理程序.只要您的问题与只读问题有关,解决方法就有点像这样:

def readonly_handler(func, path, execinfo): 
os.chmod(path, 128) #or os.chmod(path, stat.S_IWRITE) from "stat" module
func(path)

正如您在 python 文档中看到的那样,onerror 必须是一个接受三个参数的可调用函数:函数、路径和 excinfo。如需更多信息,read the docs.

def overwrite(src, dest):
if(not os.path.exists(src)):
print(src, "does not exist, so nothing may be copied.")
return

if(os.path.exists(dest)):
shutil.rmtree(dest, onerror=readonly_handler)

shutil.copytree(src, dest)
print(dest, "overwritten with data from", src)
print("")

当然,这个处理程序简单而具体,但是如果发生其他错误,将引发新的异常并且这个处理程序可能无法修复它们!

注意:Tim Golden(Python for windows 贡献者)一直在修补 shutil.rmtree 问题,它似乎将在 Python 3.5 中得到解决(参见 issue 19643)。

关于python - shutil.rmtree 不适用于 Windows 库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23924223/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com