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

移动指定目录保留结构时触发FileNotFoundError与shutil.Error

问题产生原因
  • os.walk默认采用自顶向下的遍历逻辑,会在遍历初始阶段缓存当前层级的子目录列表。你在遍历过程中直接执行目录移动操作,会实时修改磁盘上的源目录结构,导致os.walk缓存的目录列表和实际结构不匹配,遍历到后续目录时就会触发FileNotFoundError,无法处理完所有匹配的目录。
  • 执行shutil.move时没有提前创建目标路径的父级目录。比如第一次移动时目标路径下的fg-2022-07-07/upload/层级根本不存在,shutil.move不会自动创建缺失的父目录,会直接抛出参数错误/路径不存在的异常。
修复方法

核心调整两点:

  • 遍历阶段只收集所有需要移动的目录路径,不做任何目录修改操作,等遍历完成拿到完整的待移动列表后,再统一执行移动,避免遍历过程中打乱目录结构。
  • 每次移动前,先递归创建目标路径对应的所有父目录,确认路径存在后再执行移动操作。

修复后的完整代码:

import os
import shutil

SRC = '/home/usr/source'
DEST = '/home/usr/destination'

# 收集所有待移动的目录路径
move_tasks = []
for dirpath, dirnames, _ in os.walk(SRC):
    for folder in dirnames:
        if "results_" in folder:
            src_full_path = os.path.join(dirpath, folder)
            dest_full_path = src_full_path.replace(SRC, DEST, 1)
            move_tasks.append((src_full_path, dest_full_path))

# 批量执行移动
for src_path, dest_path in move_tasks:
    # 提前创建目标路径的父目录,已存在则跳过不报错
    os.makedirs(os.path.dirname(dest_path), exist_ok=True)
    shutil.move(src_path, dest_path)

运行上述代码后,就能得到预期的目录结构,所有带results_的目录会完整保留层级移动到目标路径下,源路径下仅保留非results相关的目录。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 20:15:52