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

技术问询:如何为分层结构数据集的每个图片子目录随机选10张图?

不用手动操作!写个脚本轻松搞定分层目录的图片抽样需求

当然不用手动一张张选啦,咱们用Python脚本就能自动化实现每个子目录保留恰好10张随机图片的需求~先看看你现有代码里的几个小问题,再给你一个靠谱的实现方案:

你的测试代码里的坑

  1. random.sample用错地方啦:你现在把单个文件路径fullPath传给random.sample,但这个函数需要的是一个可迭代的列表(比如某个目录下的所有图片路径),直接传单个路径会报错哦。
  2. 没有按子目录分组处理:你的递归逻辑是把所有文件都塞进同一个列表里,没法实现“每个子目录单独留10张”的核心需求。

正确的实现思路&代码

咱们换个思路:遍历目录树时,按子目录分组处理,每个目录单独收集图片、抽样,最后可选复制文件或者记录路径。

import os
import random
from shutil import copy2

def process_image_directories(source_dir, target_dir=None, keep_num=10):
    # 遍历目录树,获取每个目录的路径、子目录、文件
    for dir_path, _, file_names in os.walk(source_dir):
        # 筛选出图片文件(可以根据需要添加更多格式,比如.webp)
        image_files = [
            file for file in file_names 
            if file.lower().endswith(('.jpg', '.jpeg', '.png', '.gif'))
        ]
        
        if not image_files:
            continue  # 没有图片的目录直接跳过
        
        # 随机选图:如果图片数≥10就选10张,不足的话全留(避免报错)
        selected_images = random.sample(image_files, min(keep_num, len(image_files)))
        
        # 可选:把选中的图片复制到新目录,保持原层级结构
        if target_dir:
            # 计算原目录相对于源目录的路径,用来在目标目录重建结构
            relative_path = os.path.relpath(dir_path, source_dir)
            target_sub_dir = os.path.join(target_dir, relative_path)
            # 自动创建不存在的目录
            os.makedirs(target_sub_dir, exist_ok=True)
            
            for img in selected_images:
                src = os.path.join(dir_path, img)
                copy2(src, target_sub_dir)  # copy2会保留文件元数据
        
        # 把选中的图片路径写入记录文件
        with open("selected_images.txt", "a", encoding="utf-8") as f:
            for img in selected_images:
                full_img_path = os.path.join(dir_path, img)
                f.write(f"{full_img_path}\n")

# 配置你的路径
source_directory = 'C:/Users/bla/bla'
# 如果需要复制筛选后的图片到新目录,就填这个路径,不需要的话设为None
target_directory = 'C:/Users/bla/filtered_images'

# 执行处理
process_image_directories(source_directory, target_directory)

代码关键点说明

  • os.walk遍历目录:比递归写起来更简洁,能直接拿到当前目录的所有信息,不用自己手动拼接路径。
  • 图片格式筛选:避免把非图片文件(比如缓存文件、文档)算进去,你可以根据自己的需求添加更多后缀。
  • 容错处理:用min(keep_num, len(image_files))保证如果子目录下图片不足10张时不会报错,直接保留所有图片。
  • 可选复制功能:如果需要实际保留筛选后的文件,而不是只记录路径,就设置target_dir,脚本会自动重建原目录结构,把选中的图片复制过去。

小提示

  • 运行前建议先找个小测试目录试一下,确认逻辑符合你的需求。
  • 如果不需要复制文件,只需要记录路径,把target_directory设为None就行。

内容的提问来源于stack exchange,提问作者Simo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 17:57:31