如何修改代码实现遍历目录时每个文件夹至少保留一张图片
实现每个文件夹至少保留一张图片的切片移除方案
你当前的代码是逐张检查并删除不符合条件的图片,但没有提前判断删除后会不会把文件夹删空。要保证每个子文件夹至少留一张图,得调整删除逻辑,先统计再执行删除操作,避免误删到空。
修改后的代码
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
相关产品推荐
相关产品推荐

