技术求助:如何用Python删除CSV中对应缺失图片的行?
解决CSV与图片文件夹不匹配的问题
我来帮你搞定这个问题——核心就是先把CSV里对应test_images中不存在的图片行删掉,再进行后续的图片加载操作,这样就能保证数据和图片完全对应了。
第一步:先写个检查图片是否存在的工具函数
这个函数会帮我们判断某个图片文件是不是真的在目标文件夹里:
def is_image_exists(image_name, is_test): # 根据是否为测试集选择对应文件夹 folder_name = "train_images" if not is_test else "test_images" # 用os.path.join拼接路径,避免手动拼写出错 full_image_path = os.path.join(os.getcwd(), folder_name, image_name) # 检查路径对应的是文件且确实存在 return os.path.isfile(full_image_path)
第二步:修改get_data函数,过滤无效行
读取CSV之后,直接筛掉那些图片不存在的条目,这样返回的DataFrame就只包含有效数据了:
def get_data(is_test=False): data_path = "train" if is_test: data_path = "test" # 读取原始CSV文件 df = pd.read_csv( 'C:/Users\zaid-pc/AnacondaProjects_old/dataset/new short dataset/listing-'+data_path+'.csv', encoding="ISO-8859-1", names=['ASIN', 'F', 'IMAGE_URL', 'TITLE', 'AUTHOR', 'ID', 'CAT'] ) # 过滤:只保留图片存在的行 df = df[df['IMAGE_URL'].apply(lambda img_name: is_image_exists(img_name, is_test))] # 重置索引,避免后续处理出现索引混乱的问题 df = df.reset_index(drop=True) return df
第三步:优化图片加载函数(可选)
现在我们已经提前过滤了无效图片,加载时可以简化逻辑,同时增加异常处理应对图片损坏的情况:
def loadImages(fnames,is_test): folder_name = "train_images" if not is_test else "test_images" base_path = os.path.join(os.getcwd(), folder_name) loadedImages = [] for image in fnames: full_path = os.path.join(base_path, image) try: with Image.open(full_path) as tmp_img: # 复制图片对象,避免文件句柄被提前关闭 img_copy = tmp_img.copy() loadedImages.append(img_copy) except Exception as e: print(f"加载图片失败 {full_path}: {str(e)}") # 如果遇到损坏的图片,你也可以选择从DataFrame中移除对应行,按需处理 return loadedImages
为什么之前的尝试会失败?
你之前的逻辑是先读全量CSV,再加载图片时跳过不存在的,但没有同步删除CSV里的对应行——这会导致后续处理(比如标签和图片匹配)时,数据行数和图片数量不一致,自然会出问题。现在我们提前在读取CSV阶段就过滤掉无效条目,从根源上保证了数据和图片的对应性。
使用示例
调用的时候就像这样:
# 获取过滤后的测试数据 test_data = get_data(is_test=True) # 提取有效图片文件名列表 test_img_names = test_data['IMAGE_URL'].tolist() # 加载图片 test_images = loadImages(test_img_names, is_test=True) # 验证一下数据是否匹配 print(f"过滤后测试数据行数: {len(test_data)}") print(f"成功加载的图片数量: {len(test_images)}")
这样就能确保CSV里的每一行都对应文件夹里真实存在的图片了,后续提取像素、生成标签的逻辑也能正常运行。
内容的提问来源于stack exchange,提问作者Assad Rasheed
相关产品推荐
相关产品推荐

