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

技术求助:如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 03:52:03