AttributeError:' NoneType'对象没有属性'形状'我的代码有什么问题?

时间:2018-02-05 06:38:58

标签: python

我收到错误,AttributeError:' NoneType' object没有属性' shape。我在views.py

中写了代码
import os
import cv2
from pathlib import Path
import random

path = Path(__file__).parent
path /= "../../image1"

path1 = Path(__file__).parent
path1 /= "../../image2"

index_list =[]
for i in path.iterdir():
  i = str(i)
  print(i)
  if i.split(".")[-1].lower() in {"jpeg", "jpg", "png"}:
      list_img = cv2.imread(i)
      index_list.append(list_img)

num = 0
for j in path.iterdir():
  j = str(j)
  if j.split(".")[-1].lower() in {"jpeg", "jpg", "png"}:
        img = cv2.imread(j)
        num += 1

        random_int = random.randint(0, 9)
        index = index_list[random_int]
        height1 = index.shape[0]
        width1 = index.shape[1]
        print(height1)
        print(width1)

当我运行此代码时,出现错误,height1 = index.shape [0] AttributeError:' NoneType'对象没有属性'形状' 。 在image1的文件夹中,有5张图片在那里,如photo1,photo2,photo3,photo4,photo5。我推出了这个程序,所以我发现photo3导致了这个错误,我从image1&#39文件夹中删除了photo3。我再次运行这个程序,photo2导致这个错误。我真的不明白为什么会发生这个错误。我想错误的文件夹路径可能导致这个错误,但是错了。我该怎么解决这个问题?我的代码有什么问题?

1 个答案:

答案 0 :(得分:0)

变量indexNone,表示index_list中的一个或多个项目为None。这可能是因为找不到先前使用cv2.imread()打开的图像。正如the documentation所述,“即使图片路径错误,也不会产生任何错误,但print img会给您None。”

这是一个错误情况,您应该测试可能发生的时间,并且当找到它时,句柄(例如,通过显示错误消息并禁止从保存它进一步处理)。不要像现在这样做,忽略错误条件并允许问题传播到以后的代码,然后您必须弄清楚index如何成为None。如果您已经编写了最基本的错误处理,那么您的问题是“为什么cvv.imread()找不到我的图像文件?”而不是“为什么Python抱怨NoneType对象?”

要检测错误,您可以使用以下内容:

list_img = cv2.imread(i)
if list_img is None:
    print("Couldn't open file %s" % i)
else:
    index_list.append(list_img)

这至少会告诉您是否正在尝试打开您认为的文件。我的猜测是它没有找到你的任何文件,因为你从一个不是工作目录的目录中得到一个文件列表,但是在打开文件时你没有指定那个目录名。因此,它正在寻找工作目录中的文件,而不是它们。