如何遍历多级目录,定位目标子文件夹并重命名移动文件?
多级目录文件处理优化方案
原代码核心问题
- 循环变量冲突:
os.walk返回的files变量被后续for files in os.listdir(target)覆盖,导致逻辑混乱。 - 路径处理错误:手动用
+ "/"拼接路径,跨系统兼容性差;且目标路径构造错误,导致文件无法移动。 - 文件名拆分脆弱:直接按
.拆分文件名,若文件名含多个.(如data.v1.csv.gz)会出错。 - 层级判断缺失:未限制仅处理第二级目录,可能误匹配更深层级的同名文件夹。
修复优化后的代码
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
相关产品推荐
相关产品推荐

