14 votos

El objeto 'NoneType' no tiene atributo

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'
 

17voto

rAndy Puntos 327

Así que, básicamente, lo que esto está diciendo, en Python hablar, es que su intento de abrir el archivo de forma fallida. Cuando algo como osgeo.ogr.Open() falla, normalmente devuelve None, que, en su caso, se asigna a la variable "shapefile". Cuando intenta tener acceso a continuación shapefile más tarde, le dice que shapefile "NoneType" (en lugar del tipo de objeto que osgeo habría creado) y que NoneType objetos no tienen el método GetLayerCount.

¿Cómo se puede solucionar este problema? En primer lugar, comprobar si hay errores en el código que te dan mejor los mensajes. Algo así 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

Así que ahora necesitamos para responder a la pregunta de por qué su shapefile no se está cargando. Mi conjetura es que usted necesita para proporcionar la ruta de acceso completa (es decir, "C:\Users...\tl_2009_us_state.shp") porque osgeo no puede encontrar su shapefile con la ruta de acceso que se presta actualmente. Esa es una corazonada, aunque.

7voto

hernan43 Puntos 566

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

 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()
...
 

1voto

Icapan Puntos 344

He encontrado este error antes y me he quedado estancado durante tanto tiempo. Lo hice trabajar usando un shapefile diferente. El archivo de forma de tigre de los Estados Unidos debe haber sido dañado o algo así. Estoy usando gdal1.6 aquí.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X