วัตถุ '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 ของคุณ โปรดบันทึกสคริปต์ python ภายในโฟลเดอร์ที่มีข้อมูลของคุณเช่นtl_2009_us_state.shpไฟล์
CalebJ

คำตอบ:


17

ดังนั้นโดยพื้นฐานแล้วสิ่งที่เราพูดใน Python นั้นคือความพยายามในการเปิด Shapefile ของคุณล้มเหลว เมื่อสิ่งที่ชอบ osgeo.ogr.Open () ล้มเหลวก็มักจะส่งกลับไม่มีซึ่งในกรณีของคุณได้รับมอบหมายให้ตัวแปร "shapefile" ของคุณ เมื่อคุณพยายามเข้าถึง shapefile ในภายหลังมันจะบอกคุณว่า shapefile คือ "NoneType" (แทนที่จะเป็นประเภทของวัตถุที่ osgeo สร้างขึ้น) และวัตถุ 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

ดังนั้นตอนนี้เราต้องตอบคำถามว่าทำไมรูปร่างของคุณจึงไม่โหลด ฉันเดาว่าคุณต้องระบุเส้นทางที่ผ่านการรับรองอย่างสมบูรณ์ (เช่น "C: \ Users ... \ tl_2009_us_state.shp") เนื่องจาก osgeo ไม่สามารถหา shapefile ของคุณด้วยเส้นทางที่ให้ไว้ในปัจจุบัน แม้ว่าจะเป็นลางสังหรณ์


1
ไม่นั่นไม่ใช่ "งูใหญ่พูด" เลย ดังที่ไมค์บอกไว้ด้านล่างแทนที่จะส่งคืนไม่มีนี่คือสิ่งที่ osgeo.ogr ควรทำ: "IOError [คำอธิบายสั้น ๆ ]"
sgillies

ขออภัยสิ่งที่ฉันพยายามจะพูดคือ "วัตถุ" NoneType "ไม่มีแอตทริบิวต์ 'GetLayerCount'" เป็นข้อความแสดงข้อผิดพลาด Python มาตรฐานที่เกิดขึ้นบ่อยครั้งเมื่อคุณคาดหวังว่าวัตถุจะได้รับมอบหมายไม่ว่าด้วยเหตุผลใดก็ตาม รับมอบหมาย ขออภัยที่ไม่ชัดเจน
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 shape ต้องมีความเสียหายหรือบางอย่าง ฉันใช้ gdal1.6 ที่นี่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.