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

如何遍历多级目录,定位目标子文件夹并重命名移动文件?

多级目录文件处理优化方案

原代码核心问题

  1. 循环变量冲突:os.walk返回的files变量被后续for files in os.listdir(target)覆盖,导致逻辑混乱。
  2. 路径处理错误:手动用+ "/"拼接路径,跨系统兼容性差;且目标路径构造错误,导致文件无法移动。
  3. 文件名拆分脆弱:直接按.拆分文件名,若文件名含多个.(如data.v1.csv.gz)会出错。
  4. 层级判断缺失:未限制仅处理第二级目录,可能误匹配更深层级的同名文件夹。

修复优化后的代码

import os
import shutil

def organizer(parent_dir, target_subfolder, destination_dir):
    # 确保目标目录存在,不存在则自动创建
    os.makedirs(destination_dir, exist_ok=True)
    
    for root, dirs, files in os.walk(parent_dir):
        # 计算当前目录相对于父目录的层级,仅处理第二级目录(父目录为第0级)
        relative_depth = os.path.relpath(root, parent_dir).count(os.sep)
        if relative_depth != 1:
            continue
        
        # 检查当前第二级目录下是否存在目标子文件夹
        target_folder_path = os.path.join(root, target_subfolder)
        if not os.path.isdir(target_folder_path):
            continue
        
        # 遍历目标子文件夹内的文件
        for filename in os.listdir(target_folder_path):
            # 跳过隐藏文件
            if filename.startswith("."):
                continue
            # 仅处理.csv.gz格式文件
            if not filename.endswith(".csv.gz"):
                continue
            
            # 构造源文件完整路径
            src_full_path = os.path.join(target_folder_path, filename)
            # 提取第二级目录名作为subject_id,构造新文件名
            subject_id = os.path.basename(root)
            new_filename = f"{subject_id}_{filename}"
            # 构造目标文件完整路径
            dest_full_path = os.path.join(destination_dir, new_filename)
            
            # 移动并重命名文件
            shutil.move(src_full_path, dest_full_path)

关键优化点说明

  • 精准层级控制:通过os.path.relpath和os.sep计数,确保只处理第二级目录,避免误操作。
  • 安全路径拼接:全程使用os.path.join处理路径,适配Windows/macOS/Linux不同系统的路径分隔符。
  • 健壮的文件名处理:针对.csv.gz双重扩展名,直接通过后缀判断,避免拆分错误;用第二级目录名作为标识重命名文件,确保文件名唯一且有意义。
  • 前置目录检查:提前创建目标目录,避免移动时因目录不存在报错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 03:15:32