Python实现:基于CSV清单批量提取指定子文件夹内的图片
定向图片提取完整实现方案
基于你已完成的CSV读取、生成目标子文件夹名称列表的逻辑,补充以下代码即可实现功能,全程使用Python标准库,无需安装第三方依赖。
核心实现逻辑
- 先扫描主文件夹下的所有一级子文件夹,构建「文件夹名称-完整路径」的映射字典,把原本需要反复遍历查找的低效O(n)匹配变成O(1)快速匹配,处理1000+文件夹时性能优势明显
- 对CSV导出的目标列表做去首尾空格处理,避免CSV字段带不可见空格、换行符导致匹配失败
- 筛选图片时同时兼容大小写后缀(比如
.JPG/.jpg都能识别) - 复制图片时自动给文件名加源文件夹名前缀,避免不同子文件夹下的同名图片被覆盖
- 执行完成后自动统计匹配失败的目标文件夹清单,方便后续排查问题
可直接运行的完整代码
import csv import os import shutil # -------------------------- 需根据实际环境修改的配置项 -------------------------- # 替换为存放1000+子文件夹的主目录绝对/相对路径 MAIN_FOLDER_ROOT = "./your_main_folder_root_path" # 替换为提取后图片的存储路径,脚本会自动创建不存在的目录 OUTPUT_IMAGE_ROOT = "./extracted_target_images" # 需要识别的图片后缀,可根据实际资源类型增减 IMAGE_SUFFIX = (".jpg", ".jpeg", ".png", ".bmp", ".webp", ".tiff", ".gif") # --------------------------------------------------------------------------- # 自动创建输出目录,避免路径不存在引发报错 os.makedirs(OUTPUT_IMAGE_ROOT, exist_ok=True) # 原有逻辑:从CSV文件读取TREE_MARK字段生成目标文件夹列表 treelist = [] with open("XXX.csv", "r", encoding="utf-8") as csv_file: csv_reader = csv.DictReader(csv_file, delimiter=',') for lines in csv_reader: # 去除字段首尾的不可见空格、换行,提升匹配鲁棒性 target_folder_name = lines['TREE_MARK'].strip() treelist.append(target_folder_name) # 扫描主目录下所有一级子文件夹,构建路径映射表 folder_path_map = {} for entry in os.scandir(MAIN_FOLDER_ROOT): if entry.is_dir(): # 文件夹名同样去除首尾空格作为映射键 folder_path_map[entry.name.strip()] = entry.path # 遍历目标列表,匹配路径并提取图片 success_match_count = 0 unmatched_list = [] for target_name in treelist: # 匹配不到对应文件夹的直接记录,不中断脚本运行 if target_name not in folder_path_map: unmatched_list.append(target_name) continue success_match_count += 1 source_folder = folder_path_map[target_name] # 遍历当前匹配到的文件夹内的所有文件 for file_entry in os.scandir(source_folder): # 筛选图片文件,后缀统一转小写兼容大小写命名 if file_entry.is_file() and file_entry.name.lower().endswith(IMAGE_SUFFIX): # 生成带源文件夹前缀的安全文件名,避免同名覆盖 output_file_name = f"{target_name}_{file_entry.name}" # 复制文件并保留原文件的元数据(修改时间、创建时间等) shutil.copy2( src=file_entry.path, dst=os.path.join(OUTPUT_IMAGE_ROOT, output_file_name) ) # 打印最终执行结果 print(f"匹配成功的目标文件夹数量:{success_match_count}") if unmatched_list: print(f"未匹配到主目录下对应路径的目标文件夹清单:{unmatched_list}")
常见坑点说明
- 不要用
os.listdir做文件夹扫描:同等数据量下os.scandir的遍历速度是它的3-5倍,处理千级文件夹时效率差异明显 - 读取CSV时建议显式指定
encoding="utf-8":可以避免Windows环境下中文路径、中文文件名的读取乱码问题 - 图片复制优先用
shutil.copy2:相比shutil.copy会完整保留原文件的元数据,更适合做资源批量提取备份
内容的提问来源于stack exchange,提问作者James Rodriguez
相关产品推荐
相关产品推荐

