Python使用shutil.copy按文件名分类文件触发FileNotFoundError如何解决
问题原因分析
- 源文件路径缺失前缀目录:
os.listdir()仅返回文件本身的名称,不会携带Downloaded_Data源目录前缀,你直接将filename作为shutil.copy2()的源路径参数时,程序默认在当前脚本运行的工作目录查找文件,自然找不到存放在Downloaded_Data下的目标文件。 - 目标目录结构拼接错误:你构建
dest_dir时错误拼接了filename参数,导致生成的路径为Input_Data/颜色_温度/组别/文件名,后续调用mkdir会直接把文件名创建为一个文件夹,完全不符合你预期的二级目录结构,也会导致后续拷贝路径错误。 - 部分源文件名携带多余空白字符:你提供的文件列表中多个文件名末尾有空格,会导致分割文件名时获取到异常字段,报错信息中出现的
Subject_Blue_Cold_D_A_1.csv .csv就是文件名末尾空格导致的拼接异常。 - 依赖库导入缺失:你的代码没有导入
shutil和pathlib.Path两个依赖,运行时会先触发名称未定义的报错。
修复后可运行代码
import os import shutil from pathlib import Path source_folder = Path("Downloaded_Data") dest_root_dir = Path("Input_Data") # 遍历源目录下所有csv文件 for file_path in source_folder.glob("*.csv"): # 去除文件名首尾空白,避免多余空格干扰逻辑 filename = file_path.name.strip() name_parts = filename.split("_") # 校验文件名格式,跳过不符合规则的异常文件 if len(name_parts) < 6: print(f"跳过不符合命名规则的文件:{filename}") continue # 拼接两级子目录名称 first_folder = f"{name_parts[1]}_{name_parts[2]}" second_folder = f"D{name_parts[4]}" # 目标目录仅拼接至二级子目录,不要加入文件名 dest_dir = dest_root_dir / first_folder / second_folder # 创建多级目录,parents=True自动补全缺失的父目录 dest_dir.mkdir(exist_ok=True, parents=True) # 拷贝时源文件用完整路径,目标路径为目标目录+文件名 shutil.copy2(file_path, dest_dir / filename)
内容的提问来源于stack exchange,提问作者LostinSpatialAnalysis
相关产品推荐
相关产品推荐

