L'oggetto 'NoneType' non ha alcun attributo


10

Sono nuovo nella programmazione geospaziale di Python. ho eseguito il seguente script e ho ricevuto il messaggio di errore corrispondente

>>> 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'

Ho provato il tuo codice localmente e funziona. Quindi, quale versione di GDAL hai installato?
Crischan,

Lo script non ha potuto accedere ai dati del tuo file di forma. Si prega di salvare lo script Python nella cartella contenente i dati, ad esempio il tl_2009_us_state.shpfile.
CalebJ,

Risposte:


17

Quindi, in sostanza, ciò che sta dicendo, in Python, è che il tuo tentativo di aprire lo shapefile è fallito. Quando qualcosa come osgeo.ogr.Open () fallisce, di solito restituisce None, che, nel tuo caso, viene assegnato alla tua variabile "shapefile". Quando si tenta di accedere successivamente allo shapefile, viene indicato che lo shapefile è "NoneType" (anziché il tipo di oggetto che osgeo avrebbe creato) e che gli oggetti NoneType non dispongono del metodo GetLayerCount.

come lo aggiusti? Innanzitutto, verifica gli errori nel tuo codice: ti darà messaggi migliori. Qualcosa di simile a:

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

Quindi, ora dobbiamo rispondere alla domanda sul perché il tuo file di forma non si sta caricando. Suppongo che sia necessario fornire il percorso completo (ad esempio "C: \ Users ... \ tl_2009_us_state.shp") perché osgeo non riesce a trovare il proprio file di forma con il percorso attualmente fornito. Questo è un sospetto però.


1
No, non è affatto "Python speak". Come dice Mike di seguito, invece di restituire None, questo è ciò che osgeo.ogr dovrebbe fare: "IOError [breve descrizione]".
sgillies,

Spiacenti, quello che stavo tentando di dire è che "L'oggetto 'NoneType' non ha alcun attributo 'GetLayerCount'" è un messaggio di errore Python piuttosto standard che si verifica spesso quando ti aspetti che un oggetto sia stato assegnato che, per qualsiasi motivo, non lo ha fatto essere assegnato. Mi dispiace che non fosse chiaro.
nicksan,

7

@ La risposta di Nick è corretta: "NoneType" significa che non è stato possibile aprire l'origine dati. OGR (e GDAL) non sollevano eccezioni dove dovrebbero normalmente, e purtroppo ogr.UseExceptions()non sembra fare nulla di utile. Ecco il mio solito blocco di codice per sollevare effettivamente le eccezioni appropriate:

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

Ho riscontrato questo errore in precedenza ed è rimasto bloccato per così tanto tempo. L'ho fatto funzionare usando uno shapefile diverso. Il file di forma della tigre americana deve essere stato corrotto o qualcosa del genere. Sto usando gdal1.6 qui.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.