¿Por qué del cursor / fila de objetos de ArcPy?

8

¿Alguien puede ayudarme a entender lo que hacen las últimas 2 líneas de este código?

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

Entiendo que la función de bucle pasa por cada registro que no tiene un valor de 'AK' y le da a ese registro un valor de "AK". Pero lo que no entiendo es por lo que el del rowy del cursorestán destinados a hacer.

Gabe
fuente
2
Por cierto, este código probablemente corrompe el Statevalor de cualquier aeropuerto que no estaba anteriormente en Alaska
Stephen Lead
3
Stephen ha escrito una buena respuesta, sin embargo, no ha aclarado por qué es importante liberar (eliminar) objetos de fila / cursor. Un cursor abierto o un objeto de fila deja un bloqueo en la clase de entidad que causará problemas al intentar realizar cambios en la clase de entidad hasta que finalice la sesión que contiene los bloqueos, generalmente al cerrar la aplicación, pero puede ser tan grave como reiniciar su computadora . Como solo tiene un campo, no necesita ser una lista (solo 'estado', no ['estado'], pero eso no lo detendrá; sin embargo, sobrescribirá cualquier estado que no sea 'AK' con "AK" como Dijo Stephen.
Michael Stimson
Gracias por su aporte, todo lo que dijeron ustedes tenía mucho sentido. * Tenga en cuenta que el archivo de forma de aeropuertos es de aeropuertos en AK, estaba completando registros que no tenían valor para STATE.
Gabe

Respuestas:

13

Esas son reliquias de un estilo anterior de arcpycursores. del row, cursoranteriormente se usaban para limpiar después de ejecutar el script eliminando los objetos rowy cursor. Ahora, el uso apropiado es envolver el cursor en una withdeclaración, que abre y cierra los objetos de fila y cursor, de la siguiente manera:

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)
Aaron
fuente
1
Tu respuesta no es del todo correcta. Todavía puede (y necesita, en algunos casos) usar el método anterior para crear el objeto del servidor y eliminarlo cuando haya terminado. Por ejemplo, para operaciones de inserción, a veces es más fácil hacerlo de esa manera ( pro.arcgis.com/en/pro-app/arcpy/data-access/… ). La principal ventaja de la declaración with es que elimina automáticamente el bloqueo de los datos si la operación falla, lo que el otro método no hace. Crear cursor - error - omite la parte del y sus datos están bloqueados.
PhilippNagel
1
@PhilippNagel, ¿cuándo necesitarías usar el método anterior para crear cursores?
Squanchy
1
Ahora que lo pienso, no estoy seguro de lo que estaba pensando en ese momento.
PhilippNagel
Desde la página UpdateCursor "Los cursores de actualización también admiten declaraciones para restablecer la iteración y ayudan a eliminar bloqueos. Sin embargo, se debe considerar usar una instrucción del para eliminar el objeto o envolver el cursor en una función para que el objeto del cursor quede fuera de alcance. protegerse contra todos los casos de bloqueo ". En otras palabras: entiendo lo siguiente: para asegurarse de que hay algo que no cuelga, es mejor usar "del row, cursor". O puede envolverlo en función para que, al final de la función, todo en el ámbito local se elimine automáticamente.
Miro