使用Python根据CSV指定图片列表从源目录迁移对应文件到目标目录
解决方案
你只需要在移动环节增加过滤逻辑,直接遍历你从CSV提取到的目标图片列表做移动即可,调整后的代码如下:
单类别处理代码
import csv import shutil import os from collections import defaultdict # 提取CSV中的目标图片列表 columns = defaultdict(list) with open('class0.csv') as f: reader = csv.DictReader(f) for row in reader: for k, v in row.items(): columns[k].append(v) # 转换为集合提升后续查找效率,适合大数据集场景 target_image_set = set(columns['images']) source_dir = '/images' target_dir = 'class0' # 自动创建目标文件夹,避免路径不存在报错 os.makedirs(target_dir, exist_ok=True) # 仅遍历目标图片列表做移动 for img_name in target_image_set: src_full_path = os.path.join(source_dir, img_name) # 增加存在性校验,避免文件不存在时报错中断 if os.path.isfile(src_full_path): shutil.move(src_full_path, os.path.join(target_dir, img_name)) else: print(f"未找到对应图片:{img_name}")
核心改动说明
- 不再遍历源目录下所有文件,直接遍历CSV提取的目标图片列表,不会误移动其他文件
- 将图片列表转为
set类型,查找效率远高于列表,数据集规模大的时候性能优势明显 - 新增目标文件夹自动创建逻辑,无需手动提前建文件夹
- 新增源文件存在性校验,漏图时仅打印提示不会中断运行
多类别批量处理优化版本
如果要同时处理3个类别的CSV文件,可以直接用以下循环版本,无需重复写代码:
import csv import shutil import os from collections import defaultdict source_dir = '/images' # 按你的实际文件配置修改即可 class_mapping = [ ("class0.csv", "class0"), ("class1.csv", "class1"), ("class2.csv", "class2") ] for csv_path, target_dir in class_mapping: columns = defaultdict(list) with open(csv_path) as f: reader = csv.DictReader(f) for row in reader: for k, v in row.items(): columns[k].append(v) target_image_set = set(columns['images']) os.makedirs(target_dir, exist_ok=True) for img_name in target_image_set: src_full_path = os.path.join(source_dir, img_name) if os.path.isfile(src_full_path): shutil.move(src_full_path, os.path.join(target_dir, img_name)) else: print(f"{csv_path} 中缺失对应图片:{img_name}")
内容的提问来源于stack exchange,提问作者fufu
相关产品推荐
相关产品推荐

