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

os.makedirs误生成文件名文件夹:如何修正文件复制路径错误?

问题修复:避免复制文件时创建同名文件夹

这个问题的核心是错误地将目标文件路径当成了文件夹路径处理,导致工具(比如shutil)自动创建同名文件夹,再把文件复制到该文件夹下。以下是具体的修复方案:

核心修复思路

  1. 遍历源目录时,严格区分文件和文件夹
  2. 对每个文件,先计算出对应的目标文件路径,确保目标路径的父文件夹存在,再直接复制文件到该路径
  3. 对每个文件夹,仅创建对应的目标文件夹(如果不存在),无需额外操作

修复后的完整代码

import os
import shutil

source_dir = "C:/Old"
target_dir = "C:/New"

# 遍历源目录的所有内容
for root, dirs, files in os.walk(source_dir):
    # 获取当前路径相对于源目录的相对路径,用于拼接目标路径
    relative_path = os.path.relpath(root, source_dir)
    current_target_dir = os.path.join(target_dir, relative_path)
    
    # 处理文件夹:创建对应的目标文件夹(如果不存在)
    if not os.path.exists(current_target_dir):
        os.makedirs(current_target_dir)
    
    # 处理文件:仅复制文件名不含"obsolete"的文件
    for file in files:
        if "obsolete" not in file:
            source_file_path = os.path.join(root, file)
            # 目标是文件路径,不是文件夹路径
            target_file_path = os.path.join(current_target_dir, file)
            # 复制文件(保留元数据)
            shutil.copy2(source_file_path, target_file_path)

关键代码解释

  • os.walk(source_dir):递归遍历源目录下的所有文件夹和文件
  • os.path.relpath(root, source_dir):获取当前遍历到的文件夹相对于源目录的相对路径,保证目标目录结构和源目录一致
  • os.makedirs(current_target_dir):创建目标文件夹,确保父路径存在(如果不存在会自动创建多级目录)
  • shutil.copy2(source_file_path, target_file_path):直接将源文件复制到目标文件路径,而不是复制到目标文件夹下——这是解决问题的核心,之前的错误往往是把target_file_path写成了文件夹路径,导致shutil自动创建同名文件夹

额外说明

如果之前的代码使用了shutil.copytree,要注意该函数是用来复制整个目录树的,不能直接用来复制单个文件;如果是处理单个文件,必须用shutil.copy或shutil.copy2,并且明确指定目标文件路径。

内容的提问来源于stack exchange,提问作者user026

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 02:00:02