如何用Python合并同名目录内容至目标目录?解决shutil.move报错
合并同名目录内容的解决方案
你的问题出在直接用shutil.move()移动整个目录——当目标目录已存在时,该方法不会自动合并内容,而是直接报错。要实现目录内容合并,需要遍历源目录内的所有文件和子目录,逐个处理后移动到目标目录。
基础合并实现(覆盖同名文件)
以下是递归合并目录的函数,会自动处理子目录,同名文件直接覆盖:
import os import shutil def merge_directories(source_dir, target_dir): # 确保目标目录存在,不存在则创建 os.makedirs(target_dir, exist_ok=True) # 遍历源目录中的每一个条目 for item_name in os.listdir(source_dir): source_item = os.path.join(source_dir, item_name) target_item = os.path.join(target_dir, item_name) if os.path.isdir(source_item): # 如果是子目录,递归合并 merge_directories(source_item, target_item) # 合并完成后删除空的源子目录 os.rmdir(source_item) else: # 移动文件,目标存在则覆盖 shutil.move(source_item, target_item)
调用示例
针对你的目录结构,假设两个Directory1分别在不同父路径下:
# 替换为实际的父路径 source_parent = "path/to/source_parent" dest_parent = "path/to/destination_parent" dir_to_merge = "Directory1" merge_directories( os.path.join(source_parent, dir_to_merge), os.path.join(dest_parent, dir_to_merge) )
可选处理方式
如果不想覆盖同名文件,可以修改文件处理逻辑:
1. 跳过已存在的文件
# 替换原函数中的文件处理部分 else: if not os.path.exists(target_item): shutil.move(source_item, target_item) else: print(f"跳过已存在文件: {target_item}")
2. 重命名重复文件
如果希望保留重复文件,自动给文件加后缀编号:
# 替换原函数中的文件处理部分 else: if os.path.exists(target_item): base_name, ext = os.path.splitext(item_name) counter = 1 # 生成不重复的文件名 while os.path.exists(os.path.join(target_dir, f"{base_name}_{counter}{ext}")): counter += 1 new_target_item = os.path.join(target_dir, f"{base_name}_{counter}{ext}") shutil.move(source_item, new_target_item) else: shutil.move(source_item, target_item)
内容的提问来源于stack exchange,提问作者Brian
相关产品推荐
相关产品推荐

