'NoneType'对象没有属性


10

我是python地理空间编程的新手。我运行了以下脚本并得到了相应的错误消息

>>> import osgeo
>>> import osgeo.ogr
>>> shapefile = osgeo.ogr.Open("tl_2009_us_state.shp")
>>> numLayers = shapefile.GetLayerCount()

Traceback (most recent call last):   
    File "<pyshell#5>", line 1, in <module>
    numLayers = shapefile.GetLayerCount() AttributeError: 'NoneType' object has no attribute 'GetLayerCount'

在本地尝试过代码,它可以正常工作。那么,您安装了哪个版本的GDAL?
Crischan 2012年

该脚本无法访问您的shapefile数据。请在包含数据的tl_2009_us_state.shp文件夹(即文件)中保存python脚本。
CalebJ

Answers:


17

因此,基本上,用Python来讲,这是您打开shapefile的尝试失败。当类似osgeo.ogr.Open()的操作失败时,通常返回None,在您的情况下,该值将分配给变量“ shapefile”。当您稍后尝试访问shapefile时,它会告诉您shapefile是“ NoneType”(而不是osgeo会创建的对象的类型),并且NoneType对象没有GetLayerCount方法。

您如何解决这个问题?首先,测试代码中的错误-它会为您提供更好的消息。就像是:

import osgeo
import osgeo.ogr
try:
    shapefile = osgeo.ogr.Open("tl_2009_us_state.shp")

    if shapefile: # checks to see if shapefile was successfully defined
        numLayers = shapefile.GetLayerCount()
    else: # if it's not successfully defined
        print "Couldn't load shapefile"
except: # Seems redundant, but if an exception is raised in the Open() call,
    #   # you get a message
    print "Exception raised during shapefile loading"

    # if you want to see the full stacktrace - like you are currently getting,
    # then you can add the following:
    raise

因此,现在我们需要回答为什么您的shapefile无法加载的问题。我的猜测是,您需要提供完全限定的路径(即“ C:\ Users ... \ tl_2009_us_state.shp”),因为osgeo无法使用当前提供的路径找到shapefile。那是预感。


1
不,那根本不是“ Python说话”。就像Mike在下面说的,这是osgeo.ogr应该做的:“ IOError [简要说明]”,而不是不返回None。
sgillies

抱歉,我要说的是“'NoneType'对象不具有属性'GetLayerCount'”,这是一个非常标准的Python错误消息,通常在您希望分配某个对象(无论出于何种原因)而没有被分配。抱歉,不清楚。
nicksan

7

@Nick的答案是正确的:“ NoneType”表示无法打开数据源。OGR(和GDAL)不会在正常情况下引发异常,但是不幸的ogr.UseExceptions()是,似乎没有任何用处。这是我通常引发适当异常的代码块:

from osgeo import ogr

# Change this to your OGR data source
ds_fname = r'C:\temp\tl_2009_us_state.shp'

ds = ogr.Open(ds_fname)
if not ds:
    raise IOError("Could not open '%s'"%ds_fname)

numLayers = ds.GetLayerCount()
...

1

我之前遇到过此错误,并且已经坚持了很长时间。我通过使用其他shapefile使它工作。美国虎形文件一定已经损坏或发生了什么。我在这里使用gdal1.6。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.