Python备份脚本复制文件时遇PermissionError权限拒绝问题求助
解决权限错误与备份脚本修正
问题根源
你遇到的PermissionError本质不是目录权限问题,而是代码逻辑错误:os.listdir()会返回源目录下的所有内容(文件+子目录),但shutil.copy2()只能复制文件,当它尝试复制New catalog这个子目录时,就会抛出权限类错误(实际是操作对象类型不匹配)。
解决建议
区分文件与目录处理
遍历源目录时,先判断当前条目是文件还是目录:- 对于文件,用
shutil.copy2()复制 - 对于目录,用
shutil.copytree()复制(注意目标目录不能提前存在,否则会报错)
- 对于文件,用
检查目标目录权限
确认D:/BACKUP_NEW目录当前用户有写入权限,有时候源目录权限没问题,但目标盘(比如D盘)的根目录权限限制会导致写入失败。尝试管理员身份运行
右键点击Python解释器或脚本文件,选择「以管理员身份运行」,排除系统权限拦截的可能。检查子目录本身权限
你只检查了PythonProjects的权限,建议确认New catalog子目录的读写权限是否正常。
修正后的代码示例
方案1:区分文件和目录逐一处理
import shutil import os sourceCatalog = "C:/Users/User/Documents/PythonProjects" destinationCatalog = "D:/BACKUP_NEW" # 确保目标目录存在,不存在则创建 os.makedirs(destinationCatalog, exist_ok=True) for item in os.listdir(sourceCatalog): source_path = os.path.join(sourceCatalog, item) dest_path = os.path.join(destinationCatalog, item) if os.path.isfile(source_path): # 复制文件 shutil.copy2(source_path, dest_path) elif os.path.isdir(source_path): # 复制目录(目标目录不存在时才执行) if not os.path.exists(dest_path): shutil.copytree(source_path, dest_path) else: print(f"目录 {dest_path} 已存在,跳过复制")
方案2:直接复制整个目录(更适合备份场景)
如果你的需求是备份整个PythonProjects目录,直接用shutil.copytree()更简单:
import shutil import os sourceCatalog = "C:/Users/User/Documents/PythonProjects" destinationCatalog = "D:/BACKUP_NEW/PythonProjects" # 确保父目录存在 os.makedirs(os.path.dirname(destinationCatalog), exist_ok=True) # 复制整个目录(目标目录不能存在) if not os.path.exists(destinationCatalog): shutil.copytree(sourceCatalog, destinationCatalog) else: print("备份目录已存在,跳过")
内容的提问来源于stack exchange,提问作者KCh
相关产品推荐
相关产品推荐

