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

如何修改代码实现遍历目录时每个文件夹至少保留一张图片

实现每个文件夹至少保留一张图片的切片移除方案

你当前的代码是逐张检查并删除不符合条件的图片,但没有提前判断删除后会不会把文件夹删空。要保证每个子文件夹至少留一张图,得调整删除逻辑,先统计再执行删除操作,避免误删到空。

修改后的代码

import os
import cv2
import numpy as np
from keras.preprocessing.image import array_to_img

folder_path = "/home/idu/Desktop/COV19D/train-seg3/covid"
# 目标目录,内部包含存放图片的子文件夹

for fldr in os.listdir(folder_path):
    sub_folder_path = os.path.join(folder_path, fldr)
    # 跳过目录中的非文件夹项,避免干扰
    if not os.path.isdir(sub_folder_path):
        continue
    
    all_files = os.listdir(sub_folder_path)
    # 如果子文件夹本来就只有1张图,直接跳过处理
    if len(all_files) <= 1:
        print(f"{sub_folder_path} 仅含1张图片,无需处理")
        continue
    
    files_to_remove = []
    files_to_keep = []
    
    for filee in all_files:
        file_path = os.path.join(sub_folder_path, filee)
        img = cv2.imread(file_path, 0)
        # 处理图片读取失败的情况
        if img is None:
            print(f"无法读取图片 {file_path},标记为待删除")
            files_to_remove.append(file_path)
            continue
        
        bright_pixel_count = np.count_nonzero(img)
        if bright_pixel_count > 1500:
            # 符合条件,保留并替换原图片
            img = np.expand_dims(img, axis=2)
            img = array_to_img(img)
            img.save(file_path, "JPEG")
            files_to_keep.append(file_path)
        else:
            # 不符合条件,标记为待删除
            files_to_remove.append(file_path)
    
    # 计算删除后剩余的图片数量
    remaining_count = len(all_files) - len(files_to_remove)
    
    if remaining_count >= 1:
        # 删除后至少剩1张,直接执行删除
        for file_path in files_to_remove:
            os.remove(file_path)
            print(f"已删除: {file_path}")
    else:
        # 待删除文件过多,删除后会空,需要强制保留至少一张
        if files_to_keep:
            # 优先保留符合条件的图片,删除其余待删项
            files_to_remove = [f for f in files_to_remove if f not in files_to_keep]
            for file_path in files_to_remove:
                os.remove(file_path)
                print(f"已删除: {file_path}")
            print(f"{sub_folder_path} 待删文件过多,已保留符合条件的图片")
        else:
            # 所有图片都不符合条件,随机留一张
            files_to_remove.pop()  # 移除最后一个待删项,留作保留
            for file_path in files_to_remove:
                os.remove(file_path)
                print(f"已删除: {file_path}")
            print(f"{sub_folder_path} 所有图片均不符合条件,已保留一张图片")
    
    # 兜底检查,防止异常情况导致文件夹为空
    if not os.listdir(sub_folder_path):
        print(f"{sub_folder_path} 目录为空,出现异常!")

关键修改说明

  • 批量统计再删除:先遍历所有图片,标记待删/待保留项,提前计算删除后的剩余数量,避免逐删时误删到空
  • 异常处理:增加图片读取失败的判断,防止损坏图片导致程序报错
  • 分层保留逻辑:优先保留符合条件的图片;如果所有图片都不符合,强制留一张,确保文件夹不为空
  • 跳过无需处理的文件夹:对原本只有1张图的子文件夹直接跳过,减少无效操作

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 06:06:25