Mengapa del cursor / objek baris dari ArcPy?


8

Dapatkah seseorang membantu saya memahami apa yang dilakukan 2 baris terakhir dari kode ini:

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

Saya mengerti bahwa fungsi loop melewati setiap record yang tidak memiliki nilai 'AK' dan memberikan catatan itu nilai "AK". Tapi apa yang saya tidak mengerti adalah apa del rowdan del cursordimaksudkan untuk melakukan.


2
Kebetulan kode ini mungkin merusak Statenilai bandara mana pun yang sebelumnya tidak di Alaska
Stephen Lead

3
Stephen telah menulis jawaban yang baik tetapi dia belum menjelaskan mengapa penting untuk melepaskan (menghapus) objek baris / kursor. Sebuah objek kursor atau baris terbuka meninggalkan kunci pada kelas fitur yang akan menyebabkan masalah ketika mencoba untuk membuat perubahan pada kelas fitur sampai sesi memegang kunci diakhiri, biasanya dengan menutup aplikasi tetapi dapat sama parahnya dengan me-restart komputer Anda . Karena Anda hanya memiliki satu bidang, daftar itu tidak perlu (hanya 'nyatakan', bukan ['nyatakan'] tetapi itu tidak akan berhenti berjalan; namun akan menimpa negara yang bukan 'AK' dengan "AK" sebagai kata Stephen.
Michael Stimson

Terima kasih atas masukan Anda, semua yang Anda katakan masuk akal. * Catatan, bandara shapefile adalah bandara di AK, saya mengisi catatan yang tidak memiliki nilai untuk NEGARA.
Gabe

Jawaban:


13

Itu adalah peninggalan gaya arcpykursor sebelumnya. del row, cursorsebelumnya digunakan untuk membersihkan setelah skrip dijalankan dengan menghapus rowdan cursorobjek. Sekarang, penggunaan yang tepat adalah untuk membungkus kursor dalam withpernyataan, yang membuka dan menutup objek baris dan kursor, sebagai berikut:

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
Jawaban Anda tidak sepenuhnya benar. Anda masih dapat (dan perlu, dalam beberapa kasus) menggunakan metode lama untuk membuat objek server dan menghapusnya setelah selesai. Misalnya untuk operasi penyisipan, kadang-kadang lebih mudah melakukannya ( pro.arcgis.com/en/pro-app/arcpy/data-access/… ). Keuntungan utama dari pernyataan with adalah bahwa secara otomatis menghilangkan kunci pada data jika operasi gagal, yang metode lain tidak lakukan. Buat kursor - kesalahan - ini melompati bagian del dan data Anda dikunci.
PhilippNagel

1
@ PhilippNagel kapan Anda perlu menggunakan metode lama untuk membuat kursor?
Squanchy

1
Sekarang saya memikirkannya, saya tidak yakin apa yang saya pikirkan saat itu.
PhilippNagel

Dari halaman UpdateCursor "Perbarui kursor juga mendukung pernyataan untuk mengatur ulang iterasi dan membantu menghilangkan kunci. Namun, menggunakan pernyataan del untuk menghapus objek atau membungkus kursor dalam suatu fungsi agar objek kursor keluar dari ruang lingkup harus dipertimbangkan untuk menjaga terhadap semua kasus penguncian. " Pemahaman saya tentang hal itu, dengan kata lain: Untuk memastikan sepenuhnya ada sesuatu yang tidak menggantung, Anda masih lebih baik menggunakan "del row, cursor". Atau Anda dapat membungkusnya menjadi fungsi sehingga dengan ujung fungsi semua dalam lingkup lokal akan dihapus secara otomatis.
Miro
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.