Tại sao del con trỏ / đối tượng hàng của ArcPy?


8

Ai đó có thể giúp tôi hiểu 2 dòng cuối của mã này không:

import arcpy
arcpy.env.workspace = "c:/esripress/python/data/exercise07"
arcpy.env.overwriteOutput = True

copy = arcpy.CopyFeatures_management("airports.shp","Results/airports.shp")
fc = "Results/airports.shp"

cursor = arcpy.da.UpdateCursor(fc, ["STATE"], ' "STATE" <> \'AK\'')
for row in cursor:
    row[0] = "AK"
    cursor.updateRow(row)
del row
del cursor

Tôi hiểu rằng hàm vòng lặp đi qua mỗi bản ghi không có giá trị 'AK' và cung cấp cho bản ghi đó một giá trị là "AK". Nhưng những gì tôi không hiểu là những gì del rowdel cursorcó nghĩa là để làm.


2
Ngẫu nhiên mã này có thể làm hỏng Stategiá trị của bất kỳ sân bay nào trước đây không có ở Alaska
Stephen Lead

3
Stephen đã viết một câu trả lời hay tuy nhiên anh ta không làm sáng tỏ lý do tại sao việc phát hành (xóa) các đối tượng hàng / con trỏ lại quan trọng. Một con trỏ hoặc đối tượng hàng mở để lại khóa trên lớp tính năng sẽ gây ra sự cố khi cố gắng thực hiện bất kỳ thay đổi nào đối với lớp tính năng cho đến khi phiên giữ khóa bị chấm dứt, thường là bằng cách đóng ứng dụng nhưng có thể nghiêm trọng như khởi động lại máy tính của bạn . Vì bạn chỉ có một trường nên nó không cần phải là một danh sách (chỉ là 'trạng thái', không phải là 'trạng thái'] nhưng điều đó sẽ không ngăn nó chạy, tuy nhiên nó sẽ ghi đè lên bất kỳ trạng thái nào không phải là 'AK' bằng "AK" như Stephen nói.
Michael Promotionson

Cảm ơn cho đầu vào của bạn, tất cả mọi thứ mà các bạn nói đều có ý nghĩa hoàn hảo. * Lưu ý, shapefile sân bay là của các sân bay ở AK, tôi đã điền vào các hồ sơ không có giá trị cho NHÀ NƯỚC.
Gabe

Câu trả lời:


13

Đó là những di tích của một kiểu arcpycon trỏ trước đó . del row, cursortrước đây được sử dụng để dọn dẹp sau khi tập lệnh được chạy bằng cách xóa các đối tượng rowcursor. Bây giờ, cách sử dụng thích hợp là bọc con trỏ trong một withcâu lệnh, cả hai đều mở và đóng các đối tượng hàng và con trỏ, như sau:

import arcpy
arcpy.env.workspace = "c:/esripress/python/data/exercise07"
arcpy.env.overwriteOutput = True

copy = arcpy.CopyFeatures_management("airports.shp","Results/airports.shp")
fc = "Results/airports.shp"

with arcpy.da.UpdateCursor(fc, ["STATE"], ' "STATE" <> \'AK\'') as cursor:
    for row in cursor:
        row[0] = "AK"
        cursor.updateRow(row)

1
Câu trả lời của bạn không hoàn toàn chính xác. Bạn vẫn có thể (và cần, trong một số trường hợp) sử dụng phương pháp cũ để tạo đối tượng máy chủ và xóa nó khi hoàn tất. Ví dụ, đối với các thao tác chèn, đôi khi thực hiện theo cách đó dễ dàng hơn ( pro.arcgis.com/en/pro-app/arcpy/data-access/ Lỗi ). Ưu điểm chính của câu lệnh with là nó tự động loại bỏ khóa trên dữ liệu nếu thao tác thất bại, điều mà phương thức khác không làm được. Tạo con trỏ - lỗi - nó bỏ qua phần del và dữ liệu của bạn bị khóa.
PhilippNagel

1
@PhilippNagel khi nào bạn cần sử dụng phương pháp tạo con trỏ cũ?
Squanchy

1
Bây giờ tôi nghĩ về nó, tôi không chắc lúc đó tôi nghĩ gì.
PhilippNagel

Từ trang UpdateCoder "Cập nhật con trỏ cũng hỗ trợ các câu lệnh để thiết lập lại phép lặp và hỗ trợ xóa khóa. Tuy nhiên, sử dụng câu lệnh del để xóa đối tượng hoặc bọc con trỏ trong hàm để đưa đối tượng con trỏ ra khỏi phạm vi bảo vệ chống lại tất cả các trường hợp khóa. " Theo cách hiểu của tôi, nói cách khác: Để hoàn toàn chắc chắn có thứ gì đó không treo, bạn vẫn nên sử dụng "del row, con trỏ". Hoặc bạn có thể gói nó vào chức năng để hết chức năng trong phạm vi cục bộ sẽ tự động bị xóa.
Miro
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.