Đối tượng 'noneType' không có thuộc tính


10

Tôi chưa quen với lập trình không gian địa lý python. tôi đã chạy đoạn script sau và nhận được thông báo lỗi tương ứng

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

Đã thử mã của bạn tại địa phương và nó hoạt động. Vậy, phiên bản GDAL nào bạn đã cài đặt?
Crischan

Kịch bản không thể truy cập dữ liệu shapefile của bạn. Vui lòng lưu tập lệnh python trong thư mục chứa dữ liệu của bạn, ví dụ như tl_2009_us_state.shptập tin.
CalebJ

Câu trả lời:


17

Về cơ bản, điều mà người ta đang nói, trong Python nói, là nỗ lực của bạn để mở shapefile đã thất bại. Khi một cái gì đó như osgeo.ogr.Open () không thành công, nó thường trả về Không, trong trường hợp của bạn, được gán cho biến "shapefile" của bạn. Khi bạn cố gắng truy cập shapefile sau đó, nó sẽ cho bạn biết rằng shapefile là "noneType" (chứ không phải là loại đối tượng mà osgeo sẽ tạo ra) và các đối tượng noneType không có phương thức GetLayerCount.

Làm thế nào để bạn khắc phục điều này? Trước tiên, hãy kiểm tra lỗi trong mã của bạn - nó sẽ cung cấp cho bạn thông điệp tốt hơn. Cái gì đó như:

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

Vì vậy, bây giờ chúng tôi cần trả lời câu hỏi tại sao shapefile của bạn không tải. Tôi đoán là bạn cần cung cấp đường dẫn đủ điều kiện (nghĩa là "C: \ Users ... \ tl_2009_us_state.shp") vì osgeo không thể tìm thấy shapefile của bạn với đường dẫn hiện được cung cấp. Đó là một linh cảm mặc dù.


1
Không, đó không phải là "Python nói". Như Mike nói bên dưới, thay vì trả về Không, đây là điều osgeo.ogr nên làm: "IOError [mô tả ngắn gọn]".
sgillies

Xin lỗi, điều tôi đã cố nói là đối tượng "'noneType' không có thuộc tính 'GetLayerCount'" là một thông báo lỗi Python khá chuẩn thường xảy ra khi bạn mong đợi một đối tượng đã được chỉ định rằng, vì bất kỳ lý do gì, không được phân công. Xin lỗi điều đó không rõ ràng.
nicksan

7

Câu trả lời của @ Nick là chính xác: "noneType" có nghĩa là không thể mở nguồn dữ liệu. OGR (và GDAL) không đưa ra ngoại lệ nơi họ thường làm, và thật không may, ogr.UseExceptions()dường như không làm gì hữu ích. Đây là khối mã thông thường của tôi để thực sự đưa ra các ngoại lệ thích hợp:

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

Tôi đã gặp phải lỗi này trước đây và đã bị mắc kẹt với nó quá lâu. Tôi đã làm cho nó hoạt động bằng cách sử dụng một shapefile khác. Shapefile Tiger của Mỹ phải bị hỏng hoặc một cái gì đó. Tôi đang sử dụng gdal1.6 ở đây.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.