Pourquoi supprimer les objets curseur / ligne d'ArcPy?

8

Quelqu'un peut-il m'aider à comprendre ce que font les 2 dernières lignes de ce code:

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

Je comprends que la fonction de boucle passe par chaque enregistrement qui n'a pas de valeur «AK» et donne à cet enregistrement une valeur de «AK». Mais ce que je ne comprends pas, c'est ce que le del rowet del cursorsont censés faire.

Gabe
la source
2
Soit dit en passant, ce code corrompt probablement la Statevaleur de tout aéroport qui ne se trouvait pas auparavant en Alaska
Stephen Lead
3
Stephen a écrit une bonne réponse mais il n'a pas expliqué pourquoi il est important de libérer (supprimer) les objets ligne / curseur. Un objet curseur ou ligne ouvert laisse un verrou sur la classe d'entités, ce qui entraînera des problèmes lors de la tentative de modification de la classe d'entités jusqu'à la fin de la session contenant les verrous, généralement en fermant l'application mais peut être aussi grave que redémarrer votre ordinateur . Comme vous n'avez qu'un seul champ, il n'est pas nécessaire que ce soit une liste (juste «état», pas [«état»] mais cela ne l'empêchera pas de fonctionner, il écrasera cependant tout état qui n'est pas «AK» avec «AK» comme Stephen a dit.
Michael Stimson
Merci pour votre contribution, tout ce que vous avez dit était parfaitement logique. * Remarque: le fichier de forme des aéroports est celui des aéroports en AK, je remplissais des enregistrements qui n'avaient aucune valeur pour STATE.
Gabe

Réponses:

13

Ce sont des reliques d'un style antérieur de arcpycurseurs. del row, cursorétaient précédemment utilisés pour nettoyer après l'exécution du script en supprimant les objets rowet cursor. Maintenant, l'utilisation appropriée consiste à encapsuler le curseur dans une withinstruction, qui ouvre et ferme les objets ligne et curseur, comme suit:

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
la source
1
Votre réponse n'est pas entièrement correcte. Vous pouvez toujours (et devez, dans certains cas) utiliser l'ancienne méthode pour créer l'objet serveur et le supprimer une fois terminé. Par exemple, pour les opérations d'insertion, il est parfois plus facile de le faire de cette façon ( pro.arcgis.com/en/pro-app/arcpy/data-access/… ). Le principal avantage de l'instruction with est qu'elle supprime automatiquement le verrou sur les données si l'opération échoue, ce que l'autre méthode ne fait pas. Créer un curseur - erreur - il saute la partie supprimée et vos données sont verrouillées.
PhilippNagel
1
@PhilippNagel quand auriez-vous besoin d'utiliser l'ancienne méthode de création de curseurs?
Squanchy
1
Maintenant que j'y pense, je ne sais pas à quoi je pensais à l'époque.
PhilippNagel
À partir de la page UpdateCursor "Les curseurs de mise à jour prennent également en charge les instructions pour réinitialiser l'itération et aider à la suppression des verrous. Cependant, l'utilisation d'une instruction del pour supprimer l'objet ou l'encapsulation du curseur dans une fonction pour que l'objet curseur soit hors de portée doit être considérée comme garde contre tous les cas de verrouillage. " Autrement dit, pour être sûr qu'il y a quelque chose qui ne pend pas, il vaut mieux utiliser "del row, cursor". Ou vous pouvez l'encapsuler dans la fonction pour que, avec la fin de la fonction, tout dans la portée locale soit automatiquement supprimé.
Miro