用Python实现数据集文件夹图片管控:保留90张删除多余图片
批量限制数据集子文件夹图片数量至90张
需求说明
我有一个数据集,目录结构包含Train、Test、Val三个主文件夹,每个主文件夹下有100+个子文件夹。需要将每个子文件夹内的图片数量限制为90张,若子文件夹内图片数量超过90张,则删除超出部分。数据集目录结构如下:
| dataset | | | | Train | | | | | | Folder (1 of 112) | | | | | | | | Images | | Test | | | | | | Folder (1 of 105) | | | | | | | | Images | | Val | | | | | | Folder (1 of 120) | | | | | | | | Images
解决方案
方法1:Python脚本(跨平台通用)
以下脚本会遍历指定根目录下的所有子文件夹,筛选常见格式的图片文件,若数量超过90则删除多余文件。可根据实际情况修改根目录路径和图片格式:
import os from pathlib import Path # 数据集根目录,替换为你的实际路径 DATA_ROOT = "./dataset" # 要保留的图片数量 MAX_IMAGES = 90 # 支持的图片格式,可按需添加 IMAGE_EXTENSIONS = ('.jpg', '.jpeg', '.png', '.bmp', '.gif') def limit_images_in_folder(folder_path): # 获取文件夹内所有图片文件 image_files = [f for f in Path(folder_path).iterdir() if f.suffix.lower() in IMAGE_EXTENSIONS] # 按文件名排序(确保删除固定顺序的多余文件,可修改排序规则) image_files.sort() if len(image_files) > MAX_IMAGES: # 计算需要删除的文件数量 files_to_delete = image_files[MAX_IMAGES:] print(f"Folder {folder_path}: 发现{len(image_files)}张图片,将删除{len(files_to_delete)}张") # 删除多余文件 for file in files_to_delete: os.remove(file) else: print(f"Folder {folder_path}: 图片数量{len(image_files)},无需处理") # 遍历Train、Test、Val三个主文件夹 for main_folder in ['Train', 'Test', 'Val']: main_folder_path = os.path.join(DATA_ROOT, main_folder) if not os.path.exists(main_folder_path): print(f"警告:主文件夹{main_folder_path}不存在,跳过") continue # 遍历主文件夹下的所有子文件夹 for sub_folder in os.listdir(main_folder_path): sub_folder_path = os.path.join(main_folder_path, sub_folder) if os.path.isdir(sub_folder_path): limit_images_in_folder(sub_folder_path) print("处理完成")
使用提示:
- 运行前务必备份数据集,避免误删
- 可先将
os.remove(file)替换为print(file),预览要删除的文件,确认无误后再执行删除 - 若需按文件修改时间排序删除,可将
image_files.sort()替换为image_files.sort(key=lambda x: x.stat().st_mtime)
方法2:Shell命令(Linux/macOS适用)
如果你使用Linux或macOS,可用以下Shell命令批量处理。替换./dataset为你的数据集根目录:
# 遍历Train、Test、Val文件夹 for main_dir in Train Test Val; do # 遍历每个主文件夹下的子文件夹 for sub_dir in ./dataset/"$main_dir"/*/; do # 获取子文件夹内的图片文件(以jpg、png为例,可按需修改) image_files=("$sub_dir"*.jpg "$sub_dir"*.png) # 过滤不存在的文件 image_files=("${image_files[@]}"/*.jpg) image_files=("${image_files[@]}"/*.png) # 计算图片数量 count=${#image_files[@]} if [ "$count" -gt 90 ]; then echo "处理文件夹: $sub_dir,当前图片数: $count,将删除 $((count-90)) 张" ls -1 "$sub_dir"*.jpg "$sub_dir"*.png | sort | tail -n +91 | xargs rm -f fi done done
使用提示:
- 建议先备份数据
- 可将
xargs rm -f替换为xargs echo,预览要删除的文件,确认后再执行删除 - 若需匹配其他图片格式,添加对应通配符即可(如
"$sub_dir"*.jpeg)
内容的提问来源于stack exchange,提问作者mayuresh
相关产品推荐
相关产品推荐

