Warum Cursor- / Zeilenobjekte von ArcPy löschen?


8

Kann mir jemand helfen zu verstehen, was die letzten 2 Zeilen dieses Codes bewirken:

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

Ich verstehe, dass die Schleifenfunktion jeden Datensatz durchläuft, der nicht den Wert 'AK' hat, und diesem Datensatz den Wert "AK" gibt. Aber was ich nicht verstehe ist, was die del rowund del cursortun sollen.


2
Übrigens korrumpiert dieser Code wahrscheinlich den StateWert eines Flughafens, der zuvor nicht in Alaska war
Stephen Lead

3
Stephen hat eine gute Antwort geschrieben, aber er hat nicht beleuchtet, warum es wichtig ist, Zeilen- / Cursorobjekte freizugeben (zu löschen). Ein geöffneter Cursor oder ein offenes Zeilenobjekt hinterlässt eine Sperre für die Feature-Class, was zu Problemen beim Versuch führt, Änderungen an der Feature-Class vorzunehmen, bis die Sitzung mit den Sperren beendet wird. In der Regel wird die Anwendung geschlossen, dies kann jedoch so schwerwiegend sein wie ein Neustart des Computers . Da Sie nur ein Feld haben, muss es keine Liste sein (nur 'state', nicht ['state'], aber das wird die Ausführung nicht stoppen; es überschreibt jedoch jeden Status, der nicht 'AK' ist, mit "AK" als Stephen sagte.
Michael Stimson

Vielen Dank für Ihre Eingabe, alles, was Sie gesagt haben, machte vollkommen Sinn. * Beachten Sie, dass das Shapefile des Flughafens von Flughäfen in AK stammt. Ich habe Datensätze ausgefüllt, die für STATE keinen Wert hatten.
Gabe

Antworten:


13

Das sind Relikte eines früheren arcpyCursors. del row, cursorwurden zuvor zur Bereinigung verwendet, nachdem das Skript ausgeführt wurde, indem die Objekte rowund gelöscht wurden cursor. Die richtige Verwendung besteht nun darin, den Cursor in eine withAnweisung zu verpacken , die die Zeilen- und Cursorobjekte wie folgt öffnet und schließt:

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
Ihre Antwort ist nicht ganz richtig. Sie können (und müssen in einigen Fällen) weiterhin die alte Methode zum Erstellen und Löschen des Serverobjekts verwenden, wenn Sie fertig sind. Zum Beispiel ist es bei Einfügevorgängen manchmal einfacher, dies so zu tun ( pro.arcgis.com/de/pro-app/arcpy/data-access/… ). Der Hauptvorteil der with-Anweisung besteht darin, dass die Sperre für die Daten automatisch aufgehoben wird, wenn der Vorgang fehlschlägt, was bei der anderen Methode nicht der Fall ist. Cursor erstellen - Fehler - Überspringt den Del-Teil und Ihre Daten werden gesperrt.
Philipp Nagel

1
@PhilippNagel wann würden Sie brauchen die alte Methode zum Erstellen Cursor verwenden , um?
Squanchy

1
Jetzt, wo ich darüber nachdenke, bin ich mir nicht sicher, woran ich damals gedacht habe.
Philipp Nagel

Von der UpdateCursor-Seite "Update-Cursor unterstützen auch Anweisungen zum Zurücksetzen der Iteration und helfen beim Entfernen von Sperren. Die Verwendung einer del-Anweisung zum Löschen des Objekts oder das Umschließen des Cursors in eine Funktion, mit der das Cursorobjekt den Gültigkeitsbereich verlässt, sollte jedoch in Betracht gezogen werden Schutz vor allen Schließfächern. " Mein Verständnis davon, mit anderen Worten: Um ganz sicherzugehen, dass etwas nicht hängt, verwenden Sie noch besser "del row, cursor". Oder Sie können es in eine Funktion einbinden, sodass mit dem Ende der Funktion alles im lokalen Bereich automatisch gelöscht wird.
Miro
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.