AttributeError: ‘NoneType’ 对象没有属性 ‘shape’

AttributeError: ‘NoneType’ 对象没有属性 ‘shape’

AttributeError: ‘NoneType’ object has no attribute ‘shape’

Python“AttributeError: ‘NoneType’ object has no attribute ‘shape’” 发生在我们访问shape一个None值的属性时,例如在将不正确的路径传递给cv2.imread().

要解决该错误,请确保指定正确的路径。

attributeerror nonetype 对象没有属性形状

这是一个非常简单的示例,说明错误是如何发生的。

主程序
import cv2 # 👇️ None img = cv2.imread('bad-path.png') # ⛔️ AttributeError: 'NoneType' object has no attribute 'shape' print(img.shape)

当传递的路径不正确时,imread方法返回 None 。

尝试访问值shape上的属性None会导致错误。

在访问之前检查变量是否不是 Noneshape

在访问属性之前,您可以使用if语句
检查变量是否为 None,shape但您仍然必须更正路径。

主程序
import cv2 img = cv2.imread('thumbnail.webp') if img is not None: print('variable is not None') print(img.shape) else: print('variable is None')

if块仅在img变量未存储None值时运行,否则,该else块运行。

您还可以将绝对路径传递给该cv2.imread()方法。

主程序
import cv2 img = cv2.imread(r'/home/borislav/Desktop/bobbyhadz_python/thumbnail.webp') if img is not None: print('variable is not None') print(img.shape) else: print('variable is None')

我在 Linux 上,所以我的绝对路径以/home/user.

如果您使用的是 Windows,您的绝对路径将类似于以下内容。

主程序
import cv2 img = cv2.imread(r'C:\Users\bobby_hadz\Desktop\thumbnail.webp') if img is not None: print('variable is not None') print(img.shape) else: print('variable is None')

确保在路径前加上 anr以将其视为
原始字符串

使用try/except语句来处理错误

您还可以使用
try/except 语句来处理错误。

主程序
import cv2 img = cv2.imread('thumbnail.webp') try: print(img.shape) except AttributeError: print('AttributeError: value is', img)

如果访问shape图像上的属性导致AttributeError,则
except块运行。

调用前检查路径是否存在cv2.imread()

您可以将路径传递给该os.path.exists()方法以检查该路径是否存在。

主程序
import os # 👇️ check if path exists print(os.path.exists('thumbnail.webp')) # 👇️ returns the current working directory print(os.getcwd()) # 👉️ /home/borislav/Desktop/bobbyhadz_python

os.getcwd()方法返回当前工作目录,可在构建路径时使用。

None共同的价值来源

最常见的None价值来源是:

  1. 有一个不返回任何东西的函数(None隐式返回)。
  2. 将变量显式设置为None.
  3. 将变量分配给调用不返回任何内容的内置函数的结果。
  4. 具有仅在满足特定条件时才返回值的函数。

请注意,所有未显式返回值的函数都隐式返回
None

一个不返回任何东西的函数返回 None

这是错误如何发生的另一个示例。

主程序
import cv2 def get_path(): print('thumbnail.webp') # 👇️ None img = cv2.imread(get_path()) # ⛔️ AttributeError: 'NoneType' object has no attribute 'shape' print(img.shape)

get_path函数不返回任何内容,因此它
返回 None

我们最终传递None给了方法,所以当我们访问一个值的属性cv2.imread时发生了错误shapeNone

要解决错误,请确保从函数返回一个值。

主程序
import cv2 def get_path(): return 'thumbnail.webp' # 👇️ None img = cv2.imread(get_path()) print(img.shape) # 👉️ (120, 632, 3)

我们使用return 语句从函数返回一个字符串get_path,所以一切都按预期进行。

None如果函数仅在满足特定条件时才返回值,则您也可以从函数中获取值。

您必须确保在所有情况下都从函数返回一个值。

None否则,如果不满足给定条件,函数将返回。

错误地将变量重新分配给 None

确保您没有None错误地重新分配存储字符串的变量。

主程序
import cv2 path = 'thumbnail.webp' # 👇️ reassign to None by mistake path = None img = cv2.imread(path) # ⛔️ AttributeError: 'NoneType' object has no attribute 'shape' print(img.shape)

我们最初将path变量设置为字符串,但后来将其重新分配给
None导致错误的值。

在这种情况下,您必须追踪变量设置的位置None并更正分配。

请注意,许多改变对象的内置方法(例如)返回. sort()append()None

如果错误仍然存​​在,请按照我的
AttributeError: ‘NoneType’ object has no attribute ‘X’
一文中的说明进行操作。

额外资源

您可以通过查看以下教程来了解有关相关主题的更多信息: