You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 21:25:53