天天看點

python中的一些報錯記錄(持續更新)

有時候代碼報錯,但是一下子又想不出報錯的原因,這裡慢慢記錄下來,以防止忘記.

這裡遇到一個問題,記一個問題

1、‘Nonetype' object is not iterable.

中文翻譯:'Nonetype'對象是不可疊代的。

出現這種情況,可能是None的值被指派給了多個對象如:

>>> a = b = None #沒有報錯

>>> a, b = None    #報錯了

Traceback (most recent call last):

  File "<stdin>", line 1, in <module>

TypeError: 'NoneType' object is not iterable

如果是函數,需要考慮函數并沒有return,但是确指派給了對象,或者指派給了多個對象

2、TypeError:TypeError: list indices must be integers, not tuple

中文翻譯:list indices必須是整數,而不是元組

這種情況我也不知道該如何解答,答題涉及到list是不是數組這個說法,在numpy中,提出的array中的資料類型必須全部相同,而list不是必須相同,list存放的是指針,是資料的位址.具體例子如下

>>> a = [[1,2],[2,3],[3,6]]
>>> a[1][1]
3
>>> a[1,1]#報錯了
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: list indices must be integers, not tuple
>>> b =np.array( [[1,2],[2,3],[3,6]])#而經過數組轉化後,就不報錯了
>>> b[1,1]
3
>>> b[1][1]
3
>>> 
           

3、'dict_keys' object does not support indexing

中文翻譯:'dict_keys'對象不支援索引

這是我在生産決策樹代碼的時候遇到的,我的代碼使用的是python3,但是源代碼使用的是python2,是以報了這個錯

firstStr = inputTree.keys()[0] 注意:python3會報錯,需要改成

firstSides = list(inputTree.keys())
firstStr = firstSides[0]           

4、ValueError: math domain error

中文翻譯:數學域出錯

這是我在用,math庫的時候遇到的問題,先講個簡單例子

python 2 中 

>>> a = 1/3

>>> a

python3中

>>> a = 1/3

>>> a

0.3333333333333333

是以,在計算的時候注意一下,math.log(prob,2)這裡的prob是不能為0的

>>> math.log(0,2)

Traceback (most recent call last):

  File "<stdin>", line 1, in <module>

ValueError: math domain error

>>> math.sqrt(-1)

Traceback (most recent call last):

  File "<stdin>", line 1, in <module>

ValueError: math domain error

這幾個例子可以發現,比如,開根号下不能有負數,log的對象不能為0等

5、TypeError: can't multiply sequence by non-int of type 'numpy.float64'

can't multiply sequence by non-int of type 'float'

中文翻譯:TypeError:不能将序列乘以非int

這個問題出現的很莫名奇妙,開始碰到時是在機器學習實戰代碼裡遇到的,後來降numpy版本後又遇到第二個問題

weights = weights + alpha * error * dataArr[i]
           

網上查了一些問題,有說對numpy降級的,有說其他的,感覺不治本,于是我複現了一下這個問題,看下面

後來發現,隻要np.array()一下就可以了,将這個序列變成矩陣就可以了

import numpy as np

>>> import numpy as np

>>> a = []

>>> a.append([1,2])

>>> a.append([2,4]) #append裡面的是當成字元串,當然不能乘非int型啊

>>> a

[[1, 2], [2, 4]]

>>> a*1.0

Traceback (most recent call last):

  File "<stdin>", line 1, in <module>

TypeError: can't multiply sequence by non-int of type 'float'

>>> 1*a

[[1, 2], [2, 4]]

>>> a*2  #乘以整數的意思相當于複制粘貼,好了,懂了麼?,隻能乘以整數

[[1, 2], [2, 4], [1, 2], [2, 4]]

>>> b = np.array(a)

>>> b

array([[1, 2],

       [2, 4]])

>>> b*0.5

array([[0.5, 1. ],  #看,不報錯了

       [1. , 2. ]])

>>>

6.exceeds limit of 89478485 pixels, could be decompression bomb DOS attack.

今天用python處理大圖像的時候遇到

PIL對讀取大圖像的大小有個限制,這時候隻需要擴充這個限制就可以了

在代碼上加入

Image.MAX_IMAGE_PIXELS = 1000000000
           

7.'builtin_function_or_method' object is not subscriptable

檢查中括号或者圓括号是否缺失,或者圓括号誤寫成中括号

8.TypeError: ‘odict_items’ object does not support indexing 或TypeError: ‘dict_items’

res = model.features._modules.items()[layer_index]

 res = list(model.features._modules.items())[layer_index]

9、使用tensorflow的object detection制作自己的tfrecord資料報的錯

 Unicode strings with encoding declaration are not supported

原因:xml檔案中有一行 <?xml version="1.0" encoding="UTF-8"?>, 是以是需要再編碼的

增加一行   .encode("utf-8")

xml_path = "../data/guangchang.xml"

    with tf.gfile.GFile(xml_path, 'r') as fid:
        xml_str = fid.read()


    xml = etree.fromstring(xml_str.encode("utf-8"))
    data = dataset_util.recursive_parse_xml_to_dict(xml)['annotation']
    print(data)