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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.31 03:45:09