修正 AttributeError: ‘NoneType’ 物件沒有 ‘Shape’ 屬性

NumPy 是一個廣受歡迎的工具,用於計算涉及矩陣、陣列和數學函數的數值。NumPy 陣列的 shape 屬性返回一個元組,顯示陣列的維度。在重塑和操作 NumPy 陣列時,此屬性至關重要。

以下是 shape 屬性功能的示例:

Python

 

import numpy as np
arr = np.array([[5, 1], [16, 33]])
print(arr.shape)

輸出:

Python

 

(2, 2)

shape 屬性在 pandas 或 OpenCV 中也同樣重要。

以下是如何在 OpenCV 中使用 shape 屬性的示例:

Python

 

import cv2
img = cv2.imread(r'C:\Users\ADMIN.DESKTOP-KB78BPH\Desktop\New folder
(2)\2.jpg')
print(img.shape)

輸出結果為:

Python

 

(1280, 1920, 3)

如觀察所示,程序執行後返回形狀為 (1280, 1920, 3)。提供的細節非常重要,因為它展示了陣列的結構,從而使得對其進行操作成為可能。

然而,有時您可能嘗試訪問 shape 屬性,卻收到錯誤消息 AttributeError: NoneType 物件沒有屬性 shape。此錯誤發生在 NumPy 被 賦予 None 值或根本未初始化時。這表明陣列未正確定義,因此無法用於執行操作。

在本文中,您將了解解決此錯誤的工作方案,以便您可以使用 Pandas 和 NumPy 等數據處理庫完成開發。

我們首先概述解決方案,然後再詳細說明。讓我們開始吧。

太長不看?這裡有快速解決方案

  • 初始化一個具有有效值的陣列,或確保函數不返回 None
  • 確認圖像或視頻路徑是否正確,因為錯誤的路徑會導致錯誤提示。同時,提供一個不包含Unicode字符的路徑,因為OpenCV不支持此類字符。或者,更改圖像或視頻的位置。
  • 在加載圖像/幀後添加斷言。另一個選擇是使用try/except來處理錯誤。
  • 如果你使用人工智能生成的圖像並保存了它們,但在嘗試打開圖像時遇到了錯誤,請注意你需要添加dtype=np.uint8,以便你可以保存使用人工智能創建的圖像。此外,確保你的設備上的攝像頭未被另一個程序打開。如果是這樣,請完全關閉該程序,以便攝像頭專注於當前項目。
  • 在其他情況下,attributeerror可能是由於OpenCV的過時版本,因此嘗試更新此版本。

1. 檢查路徑

如前所述,錯誤的主要原因是使用了錯誤的路徑。因此,使用os.path.exists()方法檢查路徑是否存在於設備上是個好主意。然後,os.getcwd()函數打印當前目錄,如果你希望構建路徑,這是非常重要的。

Python

 

import os
print(os.path.exists('1.jpg'))
print(os.getcwd())

2. 使用Try/Except

也可以使用try/except語句來管理錯誤。以下是解決方案的工作原理:

Python

 

import cv2
img = cv2.imread('1.jpg')
try:
     print(img.shape)
except AttributeError:
     print('The ultimate value: ', img)

首先,try段將運行,如果遇到AttributeError,則執行except塊。

3. 使用 ‘If Else’ 语句检查变量是否为 ‘None’

为了解决这个错误,你需要确定None值的来源。让我们考虑一个常见的错误发生情况:在处理NumPy数组时。在处理NumPy数组时,当你处理一个未初始化的数组或已被赋值为None的数组时,可能会遇到这个错误。

例如:

Python

 

import numpy as np
arr = None
print(arr.shape)

上述代码的输出为:

Python

 

AttributeError: 'NoneType' object has no attribute 'shape'

你可以检查给定的语句,并确定它返回的变量类型,然后再访问形状属性。使用if-else语句在这种情况下非常有用,因为它可以让你知道shape,并在shape没有返回值时返回None

这里有一个例子:

Python

 

import cv2
img = cv2.imread(r'C:\Users\ADMIN.DESKTOP-KB78BPH\Desktop\New folder
(5)\2.jpg')
if img is not None:
     print(img.shape)
else:
     print('variable is Nonetype object')

输出:

Python

 

variable is Nonetype object

在上面的例子中,我们首先指定了绝对路径。if块仅在变量存储了非None的有效值时执行,而else块则在变量值为None时执行。我们得到的错误信息variable is Nonetype object是因为路径不存在。这些步骤适用于任何操作系统,你只需输入路径即可。

4. 初始化数组为有效值

当你在使用NumPy时遇到错误时的另一个选项是确保你使用的是有效值。这可以通过从文件或其他来源读取数据或使用NumPy函数如zeros和ones来实现。

在此,我們修改程式碼以將陣列初始化為零:

Python

 

import numpy as np
arr = np.zeros((3, 3))
print(arr.shape)

輸出:

Python

 

(3, 3)

結論

雖然AttributeError: NoneType物件沒有屬性shape在程式設計中很常見,但有幾種方法可以選擇並解決它。重要的是,在嘗試存取物件的形狀屬性之前,要檢查該物件是否為None。如果是None,則返回None;否則,返回shape

現在,您可以解決此錯誤並繼續解決問題。

Source:
https://dzone.com/articles/fix-attributeerror-nonetype-object-has-no-attribut