os.makedirs误生成文件名文件夹:如何修正文件复制路径错误?
问题修复:避免复制文件时创建同名文件夹
这个问题的核心是错误地将目标文件路径当成了文件夹路径处理,导致工具(比如shutil)自动创建同名文件夹,再把文件复制到该文件夹下。以下是具体的修复方案:
核心修复思路
- 遍历源目录时,严格区分文件和文件夹
- 对每个文件,先计算出对应的目标文件路径,确保目标路径的父文件夹存在,再直接复制文件到该路径
- 对每个文件夹,仅创建对应的目标文件夹(如果不存在),无需额外操作
修复后的完整代码
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
相关产品推荐
相关产品推荐

