Об'єкт 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 ви встановили?
Кріщан

Сценарій не міг отримати доступ до даних формату. Будь ласка, збережіть скрипт python у папці, що містить ваші дані, тобто tl_2009_us_state.shpфайл.
CalebJ

Відповіді:


17

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

Отже, тепер нам потрібно відповісти на питання, чому ваш файл форм не завантажується. Я здогадуюсь, що вам потрібно надати повністю кваліфікований шлях (тобто "C: \ Користувачі ... \ tl_2009_us_state.shp"), тому що osgeo не може знайти ваш файл форми з наданим поточним шляхом. Це хоч думка.


1
Ні, це зовсім не "Python speak". Як каже Майк нижче, замість повернення 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

Я зіткнувся з цією помилкою раніше, і я дотримувався її так довго. Я змусив його працювати, використовуючи інший файл форми. Форма файлу американського тигра, мабуть, була пошкоджена чи щось. Я тут використовую gdal1.6.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.