Obiekt „NoneType” nie ma atrybutu


10

Jestem nowym użytkownikiem programowania geoprzestrzennego w Pythonie. Uruchomiłem następujący skrypt i dostałem odpowiedni komunikat o błędzie

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

Wypróbowałem kod lokalnie i działa. Którą wersję GDAL już zainstalowałeś?
Crischan

Skrypt nie może uzyskać dostępu do danych pliku kształtu. Prosimy zapisać skrypt Pythona w folderze zawierającym dane, tj. tl_2009_us_state.shpPlik.
CalebJ

Odpowiedzi:


17

Zasadniczo w Pythonie mówi to, że próba otwarcia pliku kształtu nie powiodła się. Gdy coś takiego jak osgeo.ogr.Open () zawiedzie, zwykle zwraca None, co w twoim przypadku zostaje przypisane do zmiennej „shapefile”. Kiedy później spróbujesz uzyskać dostęp do pliku shapefile, powie ci, że plik shapefile to „NoneType” (zamiast typu obiektu, który utworzyłby osgeo) i że obiekty NoneType nie mają metody GetLayerCount.

Jak to naprawić? Najpierw przetestuj pod kątem błędów w kodzie - dostarczy Ci lepszych wiadomości. Coś jak:

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

Więc teraz musimy odpowiedzieć na pytanie, dlaczego Twój plik kształtu nie ładuje się. Domyślam się, że musisz podać w pełni kwalifikowaną ścieżkę (tj. „C: \ Users ... \ tl_2009_us_state.shp”), ponieważ osgeo nie może znaleźć twojego pliku kształtu z aktualnie podaną ścieżką. Ale to przeczucie.


1
Nie, to wcale nie jest „Python speak”. Jak mówi poniżej Mike, zamiast zwracać None, powinno to zrobić osgeo.ogr: „IOError [krótki opis]”.
sgillies

Przykro mi, ale próbowałem powiedzieć, że obiekt „NoneType” nie ma atrybutu „GetLayerCount” ”jest dość standardowym komunikatem o błędzie w języku Python, który często pojawia się, gdy oczekujesz, że obiekt został przypisany, z jakiegokolwiek powodu, nie zostać przydzielonym. Przepraszam, to nie było jasne.
nicksan

7

@ Odpowiedź Nicka jest prawidłowa: „NoneType” oznacza, że ​​nie można otworzyć źródła danych. OGR (i GDAL) nie zgłaszają wyjątków tam, gdzie normalnie powinny, i niestety ogr.UseExceptions()nie wydają się robić nic pożytecznego. Oto mój zwykły blok kodu, który faktycznie podnosi odpowiednie wyjątki:

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

Ten błąd napotkałem już wcześniej i utknąłem z nim tak długo. Mam go do pracy, używając innego pliku kształtu. Plik kształtu Tygrys amerykański musiał być uszkodzony lub coś w tym stylu. Używam tutaj gdal1.6.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.