'NoneType'개체에 속성이 없습니다


10

파이썬 지리 공간 프로그래밍을 처음 사용합니다. 다음 스크립트를 실행하고 해당 오류 메시지가 나타납니다.

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

코드를 로컬에서 시도해 보았습니다. 그렇다면 어떤 버전의 GDAL을 설치 했습니까?
Crischan

스크립트가 shapefile 데이터에 액세스 할 수 없습니다. 파이썬 스크립트를 데이터가 들어있는 폴더, 즉 tl_2009_us_state.shp파일에 저장하십시오.
CalebJ

답변:


17

따라서 기본적으로 파이썬에서 말한 것은 shapefile을 열려는 시도가 실패했다는 것입니다. osgeo.ogr.Open ()과 같은 것이 실패하면, 보통 None을 반환하는데,이 경우에는 변수 "shapefile"에 할당됩니다. 나중에 shapefile에 액세스하려고하면 shapefile이 "osgeo가 만든 개체 유형이 아닌"NoneType "이고 NoneType 개체에 GetLayerCount 메서드가 없음을 나타냅니다.

이 문제를 어떻게 해결합니까? 먼저 코드의 오류를 테스트하십시오. 더 나은 메시지를 제공합니다. 다음과 같은 것 :

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

이제 shapefile이로드되지 않는 이유에 대한 질문에 답해야합니다. osgeo가 현재 제공된 경로를 가진 shapefile을 찾을 수 없기 때문에 완전한 경로 (예 : "C : \ Users ... \ tl_2009_us_state.shp")를 제공해야합니다. 그래도 직감입니다.


1
아니, 그건 "파이썬 말하기"가 아닙니다. Mike가 아래에서 말한 것처럼 None을 반환하는 대신 osgeo.ogr이 수행해야 할 작업은 "IOError [brief description]"입니다.
sgillies

죄송합니다. " 'NoneType'개체에 'GetLayerCount'속성이 없습니다. '"는 어떤 이유로 든 개체가 할당되지 않은 것으로 예상 될 때 종종 발생하는 표준 파이썬 오류 메시지입니다. 할당받습니다. 명확하지 않은 죄송합니다.
nicksan

7

@Nick의 답변이 정확합니다. "NoneType"은 데이터 소스를 열 수 없음을 의미합니다. OGR (및 GDAL)은 일반적으로 필요한 경우 예외를 발생 ogr.UseExceptions()시키지 않으며 유감스럽게도 유용한 작업을 수행하지 않는 것 같습니다. 실제로 적절한 예외를 발생시키는 일반적인 코드 블록은 다음과 같습니다.

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

이전 에이 오류가 발생하여 오랫동안 붙어 있습니다. 다른 shapefile을 사용하여 작동하도록했습니다. US Tiger shapefile이 손상되었거나 다른 것 같습니다. 나는 여기서 gdal1.6을 사용하고 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.