ArcPyのカーソル/行オブジェクトを削除する理由


8

誰かがこのコードの最後の2行が何をするかを理解するのを手伝ってくれませんか?

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

ループ関数が「AK」の値を持たない各レコードを通過し、そのレコードに「AK」の値を与えることを理解しています。しかし、私は理解していないことは何であるdel rowdel cursor行うことを意味しています。


2
ちなみに、このコードはおそらくState以前はアラスカになかった空港の価値を損なうものと思われます
Stephen Lead

3
スティーブンは良い答えを書きましたが、行/カーソルオブジェクトを解放(削除)することが重要である理由を明らかにしていません。カーソルまたは行オブジェクトが開いていると、フィーチャクラスがロックされたままになるため、通常はアプリケーションを閉じてロックを保持しているセッションを終了するまで、フィーチャクラスに変更を加えようとすると問題が発生しますが、コンピューターの再起動と同じくらい深刻な場合があります。フィールドは1つしかないため、リストである必要はありません(['state']ではなく 'state'のみですが、実行が停止することはありません。ただし、 'AK'ではない状態は "AK"で上書きされます。スティーブンは言った
マイケル・スティムソン2017

あなたの入力をありがとう、みんなが言ったすべてが完璧に理にかなっていた。*注意、airportsシェープファイルはAKの空港のものです。STATEの値を持たないレコードを入力していました。
ゲイブ2017

回答:


13

これらは、以前のスタイルのarcpyカーソルの遺物です。del row, cursor以前はrowおよびcursorオブジェクトを削除してスクリプトを実行した後のクリーンアップに使用されていました。現在は、次のように、行オブジェクトとカーソルオブジェクトの両方を開いたり閉じたりするステートメントでカーソルをラップするのが適切ですwith

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
あなたの答えは完全に正しいわけではありません。サーバーオブジェクトを作成し、完了時に削除するという古い方法を引き続き使用できます(場合によっては必要な場合もあります)。たとえば、挿入操作の場合は、そのようにする方が簡単な場合があります(pro.arcgis.com/en/pro-app/arcpy/data-access/…)。withステートメントの主な利点は、操作が失敗した場合にデータのロックが自動的に解除されることです。これは、他のメソッドでは行われません。カーソルの作成-エラー-del部分をスキップし、データがロックされます。
PhilippNagel

1
@PhilippNagel カーソルを作成する古い方法をいつ使用する必要がありますか?
Squanchy 2018

1
今考えてみると、当時何を考えていたのかよくわかりません。
PhilippNagel

UpdateCursorページから、「更新カーソルは、ステートメントを使用して反復をリセットし、ロックの削除を支援することもサポートしています。ただし、delステートメントを使用してオブジェクトを削除するか、カーソルを関数にラップして、カーソルオブジェクトをスコープ外にして、すべてのロックケースから保護してください。」つまり、ハングしていないものがあることを完全に確認するには、「行の削除、カーソル」を使用する方がよいでしょう。または、関数にラップして、ローカルスコープのすべての関数の終わりで自動的に削除することもできます。
ミロ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.