Объект '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'
Azeez
источник
Пробовал свой код локально и все работает. Итак, какую версию GDAL вы установили?
Кришан
Сценарий не может получить доступ к вашим данным шейп-файла. Пожалуйста, сохраните скрипт Python в папке, содержащей ваши данные, т.е. в tl_2009_us_state.shpфайл.
CalebJ

Ответы:

17

В сущности, в Python говорят, что ваша попытка открыть шейп-файл не удалась. Когда что-то вроде osgeo.ogr.Open () завершается ошибкой, обычно возвращается None, который, в вашем случае, присваивается вашей переменной "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

Итак, теперь нам нужно ответить на вопрос, почему ваш шейп-файл не загружается. Я предполагаю, что вам нужно указать полный путь (например, "C: \ Users ... \ tl_2009_us_state.shp"), потому что osgeo не может найти ваш шейп-файл с указанным в данный момент путем. Это догадка, хотя.

nicksan
источник
1
Нет, это не "Python говорить" вообще. Как говорит Майк ниже, вместо возврата None, вот что osgeo.ogr должен сделать: «IOError [краткое описание]».
sgillies
Извините, я пытался сказать, что «объект« NoneType »не имеет атрибута« GetLayerCount »» - это довольно стандартное сообщение об ошибке Python, которое часто появляется, когда вы ожидаете, что объекту был присвоен объект, который по какой-либо причине не был получить назначение. Извините, это не было ясно.
Никсан
7

@ Ник отвечает правильно: «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

Я сталкивался с этой ошибкой раньше и застрял с ней так долго. Я получил его на работу с помощью другого шейп-файла. Шейп-файл US Tiger должен быть поврежден или что-то в этом роде. Я использую gdal1.6 здесь.

Магне
источник