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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 22:33:28