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

cv2.imread与os.listdir配合读取图片失败,求排查原因

问题原因与解决方案

嘿,这个问题我太熟了!你遇到的AttributeError: 'NoneType' object has no attribute 'shape'本质原因很简单:你用os.listdir()拿到的只是文件名,不是完整的文件路径。

你直接用绝对路径/home/hch/Desktop/Database/sample.jpg能读到图片,是因为路径完整,程序明确知道去哪里找文件。但当你用os.listdir("/home/hch/Desktop/Database")时,返回的filename只是sample.jpg——程序会默认在当前工作目录下去找这个文件,而不是你目标的Database文件夹,自然读不到图片,返回None,之后调用shape就触发了报错。

修正方案

有两种常用的解决方式,选你顺手的就行:

1. 用os.path.join()拼接完整路径

这是最经典的做法,把文件夹路径和文件名拼接成完整的绝对路径:

import os
import cv2  # 假设你用OpenCV读图,其他图像库逻辑一致

folder_path = "/home/hch/Desktop/Database"
for filename in os.listdir(folder_path):
    if filename.endswith(".jpg"):
        # 拼接出完整的图片路径
        full_img_path = os.path.join(folder_path, filename)
        img = cv2.imread(full_img_path)
        # 加个判断,避免损坏图片导致程序崩溃
        if img is not None:
            print(img.shape)
        else:
            print(f"无法读取图片: {full_img_path}")

2. 用pathlib(Python3.4+推荐)

pathlib是更现代的路径处理库,代码更简洁直观,还能避免手动拼接路径的失误:

from pathlib import Path
import cv2

folder_path = Path("/home/hch/Desktop/Database")
# 直接遍历文件夹下所有jpg文件
for img_path in folder_path.glob("*.jpg"):
    img = cv2.imread(str(img_path))
    if img is not None:
        print(img.shape)
    else:
        print(f"无法读取图片: {img_path}")

额外提示

  • 永远记得加if img is not None的判断,避免因为个别图片损坏、格式不兼容导致程序直接崩溃。
  • 不要依赖“当前工作目录刚好是目标文件夹上级”这种巧合,始终使用完整路径是最稳妥的做法。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 06:55:15