El objeto 'NoneType' no tiene atributo

10

Soy nuevo en la programación geoespacial de Python. ejecuté el siguiente script y obtuve el mensaje de error correspondiente

>>> 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
fuente
Intenté su código localmente y funciona. Entonces, ¿qué versión de GDAL tiene instalada?
Crischan
El script no pudo acceder a los datos de tu archivo de forma. Guarde amablemente el script de Python dentro de la carpeta que contiene sus datos, es decir, el tl_2009_us_state.shparchivo.
CalebJ

Respuestas:

17

Básicamente, lo que esto está diciendo, en Python, es que su intento de abrir el archivo de forma falló. Cuando algo como osgeo.ogr.Open () falla, generalmente devuelve None, que, en su caso, se asigna a su variable "shapefile". Cuando intente acceder a shapefile más tarde, le indica que shapefile es "NoneType" (en lugar del tipo de objeto que osgeo habría creado) y que los objetos NoneType no tienen el método GetLayerCount.

¿Cómo arreglas esto? Primero, pruebe los errores en su código; le dará mejores mensajes. Algo como:

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

Entonces, ahora debemos responder a la pregunta de por qué su archivo de forma no se está cargando. Supongo que debe proporcionar la ruta totalmente calificada (es decir, "C: \ Users ... \ tl_2009_us_state.shp") porque osgeo no puede encontrar su shapefile con la ruta actualmente proporcionada. Eso es un presentimiento sin embargo.

nicksan
fuente
1
No, eso no es "hablar Python" en absoluto. Como Mike dice a continuación, en lugar de devolver None, esto es lo que debe hacer osgeo.ogr: "IOError [breve descripción]".
sgillies
Lo siento, lo que intentaba decir era que "el objeto 'NoneType' no tiene el atributo 'GetLayerCount'" es un mensaje de error de Python bastante estándar que a menudo ocurre cuando se espera que se haya asignado un objeto que, por cualquier razón, no ser asignado Lo siento, eso no estaba claro.
nicksan
7

La respuesta de @ Nick es correcta: "NoneType" significa que no se pudo abrir la fuente de datos. OGR (y GDAL) no generan excepciones donde deberían hacerlo normalmente, y desafortunadamente ogr.UseExceptions()no parece hacer nada útil. Aquí está mi bloque de código habitual para generar las excepciones adecuadas:

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()
...
Mike T
fuente
1

He encontrado este error antes y me he quedado atascado durante tanto tiempo. Lo puse a trabajar usando un shapefile diferente. El archivo de forma de tigre de EE. UU. Debe haberse dañado o algo así. Estoy usando gdal1.6 aquí.

Revistas
fuente