Das Objekt 'NoneType' hat kein Attribut

10

Ich bin neu in der Python-Geodatenprogrammierung. Ich habe das folgende Skript ausgeführt und die entsprechende Fehlermeldung erhalten

>>> 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
quelle
Versuchte Ihren Code lokal und es funktioniert. Also, welche Version von GDAL haben Sie installiert?
Crischan
Das Skript konnte nicht auf Ihre Shapefile-Daten zugreifen. Bitte speichern Sie das Python-Skript in dem Ordner, der Ihre Daten enthält, dh in der tl_2009_us_state.shpDatei.
CalebJ

Antworten:

17

Im Grunde genommen bedeutet dies in Python, dass Ihr Versuch, das Shapefile zu öffnen, fehlgeschlagen ist. Wenn etwas wie osgeo.ogr.Open () fehlschlägt, wird normalerweise None zurückgegeben, was in Ihrem Fall Ihrer Variablen "Shapefile" zugewiesen wird. Wenn Sie später versuchen, auf Shapefile zuzugreifen, wird angezeigt, dass Shapefile "NoneType" ist (und nicht der Objekttyp, den osgeo erstellt hätte) und dass NoneType-Objekte nicht über die Methode GetLayerCount verfügen.

Wie beheben Sie das? Testen Sie zunächst Ihren Code auf Fehler, um bessere Nachrichten zu erhalten. Etwas wie:

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

Nun müssen wir die Frage beantworten, warum Ihr Shapefile nicht geladen wird. Ich vermute, dass Sie den vollständig qualifizierten Pfad angeben müssen (z. B. "C: \ Users ... \ tl_2009_us_state.shp"), da osgeo Ihr Shapefile mit dem aktuell angegebenen Pfad nicht finden kann. Das ist allerdings eine Vermutung.

Nicksan
quelle
1
Nein, das ist überhaupt nicht "Python Speak". Wie Mike weiter unten sagt, sollte osgeo.ogr Folgendes tun, anstatt None zurückzugeben: "IOError [kurze Beschreibung]".
Sgillies
Entschuldigung, ich habe versucht zu sagen, dass "'NoneType' Objekt kein Attribut 'GetLayerCount' hat" eine ziemlich normale Python-Fehlermeldung ist, die häufig auftritt, wenn Sie erwarten, dass einem Objekt zugewiesen wurde, das aus irgendeinem Grund nicht zugewiesen wurde zugewiesen werden. Entschuldigung, das war nicht klar.
Nicksan
7

Die Antwort von @ Nick ist richtig: "NoneType" bedeutet, dass die Datenquelle nicht geöffnet werden konnte. OGR (und GDAL) lösen keine Ausnahmen aus, wo sie normalerweise sollten, und ogr.UseExceptions()scheinen leider nichts Nützliches zu tun. Hier ist mein üblicher Codeblock, um tatsächlich die richtigen Ausnahmen auszulösen:

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.
quelle
1

Ich bin auf diesen Fehler schon einmal gestoßen und habe so lange daran festgehalten. Ich habe es mit einem anderen Shapefile zum Laufen gebracht. Das US Tiger Shapefile muss beschädigt worden sein oder so. Ich benutze hier gdal1.6.

Mags
quelle