Python 实现 移动指定名称的文件夹,保留原始目录结构

flyfish

源目录结构(原始结构)

源文件夹/
├─ 车间A/
│  ├─ 设备A/    ← 会被移动
│  └─ 设备B/      ← 不移动
├─ 车间B/
│  └─ 生产线1/
│     ├─ 设备A/ ← 会被移动
│     └─ 设备B/   ← 不移动

目标目录结构(移动后,严格保留原结构)

目标文件夹/
├─ 车间A/
│  └─ 设备A/
├─ 车间B/
│  └─ 生产线1/
│     └─ 设备A/

逻辑

  1. 递归遍历源目录所有子文件夹(支持无限层级)
  2. 精准匹配文件夹名:仅移动 设备A,完全忽略 设备B
  3. 保留原始层级结构:目标目录会和源目录结构完全一致
  4. 安全移动:自动创建目标目录结构,处理重复/异常情况

代码

import os
import shutil

def move_specific_folder(source_root: str, target_root: str, target_folder_name: str = "设备A"):
    """
    递归遍历源目录,仅移动指定名称的文件夹,保留原始目录结构
    :param source_root: 源根文件夹路径(要遍历的顶层目录)
    :param target_root: 目标根文件夹路径(移动到的顶层目录)
    :param target_folder_name: 要移动的文件夹名称(默认:设备A)
    """
    # 校验源目录是否存在
    if not os.path.isdir(source_root):
        print(f"源目录不存在:{source_root}")
        return

    # 递归遍历所有文件夹 (root=当前路径, dirs=子文件夹, files=文件)
    for root, dirs, files in os.walk(source_root):
        # 遍历当前路径下的所有子文件夹
        for dir_name in dirs:
            # 仅匹配 设备A,跳过 设备B
            if dir_name == target_folder_name:
                # 源文件夹完整路径
                src_folder_path = os.path.join(root, dir_name)
                # 计算【相对路径】(核心:保留原始目录结构)
                relative_path = os.path.relpath(root, source_root)
                # 目标文件夹完整路径
                target_folder_path = os.path.join(target_root, relative_path, dir_name)

                try:
                    # 自动创建目标目录的父级结构
                    os.makedirs(os.path.dirname(target_folder_path), exist_ok=True)

                    # 移动文件夹(如果目标已存在,会抛出异常,这里做安全处理)
                    if not os.path.exists(target_folder_path):
                        shutil.move(src_folder_path, target_folder_path)
                        print(f"移动成功:{src_folder_path}{target_folder_path}")
                    else:
                        print(f"目标已存在,跳过移动:{target_folder_path}")

                except Exception as e:
                    print(f"移动失败 {src_folder_path},原因:{str(e)}")

if __name__ == "__main__":
    # ====================== 修改这两个路径 ======================
    SOURCE_DIR = r"D:\源文件夹"  # 要遍历的顶层目录
    TARGET_DIR = r"D:\目标文件夹"  # 要移动到的目录
    # =================================================================

    print("开始遍历并移动「设备A」文件夹...\n")
    move_specific_folder(SOURCE_DIR, TARGET_DIR)
    print("\n执行完成!")

把代码中 SOURCE_DIRTARGET_DIR 换成自己的真实路径(Windows路径前面加 r 避免转义)。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐