如何按标签读取文件夹中图像与对应文本文件并分类保存图像
按标签分类图像文件的实现方案
问题说明
我的数据集包含两个文件夹:
- 一个文件夹存放所有图像文件
- 另一个文件夹存放对应文本标签文件,图像与标签文件名一一对应(例如
image_0000.jpeg对应image_0000.txt) - 每个标签文件内仅存储0、1、2其中一个数值作为标签
需要将标签为0、1、2的图像分别整理到对应的目标文件夹中。
注:你提供的read_image_list函数适用于读取**单文件列表(每行含文件名+标签)**的场景,但当前数据集是每个标签对应单独文件,因此需要适配新的实现逻辑。
完整实现代码
import os import shutil def sort_images_by_label(image_dir, label_dir, target_root): # 提前创建三个标签对应的目标文件夹,不存在则自动创建 for label in ('0', '1', '2'): target_folder = os.path.join(target_root, label) os.makedirs(target_folder, exist_ok=True) # 遍历所有标签文件 for txt_file in os.listdir(label_dir): # 只处理txt格式的标签文件 if not txt_file.endswith('.txt'): continue # 获取文件名前缀,用于匹配图像 file_prefix = os.path.splitext(txt_file)[0] # 匹配图像文件(支持常见格式,可按需添加) image_path = None for ext in ('.jpeg', '.jpg', '.png', '.bmp'): temp_path = os.path.join(image_dir, f"{file_prefix}{ext}") if os.path.exists(temp_path): image_path = temp_path break if not image_path: print(f"未找到与{txt_file}匹配的图像文件,跳过") continue # 读取标签值 with open(os.path.join(label_dir, txt_file), 'r') as f: label = f.read().strip() # 过滤无效标签 if label not in ('0', '1', '2'): print(f"{txt_file}中的标签{label}无效,跳过") continue # 复制图像到对应标签文件夹(若要移动文件,将copy2改为move即可) dest_path = os.path.join(target_root, label, os.path.basename(image_path)) shutil.copy2(image_path, dest_path) # ---------------------- 使用示例 ---------------------- # 替换为你自己的文件夹路径 IMAGE_FOLDER = "你的图像文件夹路径" LABEL_FOLDER = "你的标签文件夹路径" TARGET_ROOT = "分类后图像的根文件夹路径" sort_images_by_label(IMAGE_FOLDER, LABEL_FOLDER, TARGET_ROOT)
代码说明
- 自动创建目标文件夹:无需手动创建0、1、2三个文件夹,代码会自动生成
- 多格式图像匹配:支持常见的jpeg、jpg、png、bmp格式,可根据你的图像格式修改
ext元组 - 容错处理:对找不到对应图像、标签无效的情况做了跳过提示,避免程序崩溃
- 文件操作选项:默认用
copy2保留文件元数据,若需要直接移动原文件,替换为shutil.move即可
内容的提问来源于stack exchange,提问作者salih muhammad
相关产品推荐
相关产品推荐

