Suite

Utiliser arcpy.UpdateCursor pour supprimer des lignes ne supprime pas en fonction du compteur ?

Utiliser arcpy.UpdateCursor pour supprimer des lignes ne supprime pas en fonction du compteur ?


J'essaie de supprimer des lignes d'un fichier de formes à l'aide de arcpy.UpdateCursor. La première chose que j'ai faite a été d'obtenir une liste unique de valeurs à partir du champ clé "PolyGUID", puis j'ai itéré cette liste en faisant un arcpy.UpdateCursor. A l'intérieur du curseur je mets un compteur x=0 puis pour chaque enregistrement j'incrémente +1. Le deleteRow ne semble pas se produire après la suppression du deuxième enregistrement. L'objet renvoyé par UpdateCursor n'est-il pas capable de fonctionner de cette manière ? Voici le code…

import arcpy from arcpy import env outPointFromPoint = r"C:TrashNov2011ResFinalC6.shp" sql = " "PolyGUID" <>"" ocur = arcpy.SearchCursor(outPointFromPoint, sql) listDelete = [] pour oc in ocur : si oc.PolyGUID n'est pas dans listDelete : listDelete.append(oc.PolyGUID) print len(listDelete) del oc, ocur, x, sql pour lD dans listDelete : sql2 = " "PolyGUID" = " + "'" + str(lD) + "'" upcur = arcpy.UpdateCursor(outPointFromPoint, sql2, "", "", "FMEAS2 A") x=0 pour upc dans upcur : x=x+1 print upc.FMEAS2 #print x if x==1 : print x else : print "---------------------------" + str(x) print "Suppression : " + str(upc.PolyGUID) + str(upc.FMEAS2) upcur.deleteRow(upc) del sql2, upc, upcur, x, lD, listDelete

Les PolyGUID proviennent d'un polygone fc. Avoir le polygone guid dans le fc, ResFinalC6.shp, signifie que lors d'une opération LocateFeatureAlongARoute… l'enregistrement du polygone avait un ou plusieurs enregistrements résultants. Je dois me débarrasser de tous les autres enregistrements si le résultat était plus d'un enregistrement. Un enregistrement de polygone a croisé l'itinéraire à plus d'un endroit (trois fois pour les enregistrements problématiques). Le résultat donne un champ affichant la valeur m où l'intersection s'est produite. Donc, ce que j'ai fait, c'est pour chaque valeur unique dans PolyGUID obtenir un UpdateCursor… trier le champ qui contient la valeur M (car j'ai besoin de l'enregistrement avec la valeur m la plus basse) et utiliser le compteur x pour supprimer ces PolyGUID qui en ont résulté plus plus d'un enregistrement (tous sauf celui avec la valeur m la plus faible… c'est pourquoi j'ai fait le tri sur l'UpdateCursor) résultant de la requête avec l'UpdateCursor.


Le problème est qu'une fois que le curseur a parcouru l'enregistrement 1 et défini x=1… puis enregistrer 2 et définir x=2, puis supprimer l'enregistrement 2… le script accède à ces PolyGUID qui s'affichent trois fois… ma déclaration d'impression est touchée et x est défini sur x=3 mais l'enregistrement n'est pas supprimé. J'ai exécuté cela plusieurs fois et il reste toujours les mêmes PolyGUID et ils s'affichent tous trois fois avant les tentatives de suppression. Dans la fenêtre du shell python où l'impression se produit, l'enregistrement 3 est maudit mais pas supprimé.


Suite à certains des commentaires sur votre message, j'ai un peu nettoyé votre script. Il y a des variables inutiles et la logique est un peu lourde. Je n'ai évidemment pas le fichier de formes avec lequel vous travaillez et je ne l'ai pas testé avec quoi que ce soit localement, donc il mai ne fonctionne pas pour vous dès le départ, mais cela devrait au moins nous donner une bonne base pour vous aider à démarrer.

import arcpy shp = r'C:TrashNov2011ResFinalC6.shp' sql = " "PolyGUID" <>"" rows = arcpy.SearchCursor(shp, sql) delList = [] pour les lignes : delList. append(row.PolyGUID) print len(delList) del rows rows = arcpy.UpdateCursor(shp, "#", "#", "#", "FMEAS2 A") pour la ligne dans les lignes : si ligne.PolyGUID dans delList : print "Suppression : %s %s" % (row.PolyGUID,row.FMEAS2) rows.deleteRow(row) del rows

ÉDITER:

D'accord, je pense avoir une meilleure maîtrise de votre processus. Ce n'est pas le moyen le plus efficace de le faire car il créera un curseur pour chaque PolyGUID, qu'il ait ou non des entrées en double, mais c'est un début… REMARQUE : le deuxième curseur a été remplacé par un curseur de mise à jour (13:06 EST)

import arcpy shp = r'C:TrashNov2011ResFinalC6.shp' sql = " "PolyGUID" <>"" #--Tout d'abord, obtenons une liste complète de toutes les lignes PolyGUID = arcpy.SearchCursor(shp, sql) polyguids = set() for row in rows: polyguids.add(row.PolyGUID) del rows print len(polyGUIDs) #--Maintenant, itérons sur chaque PolyGUID… pour guid in polyguids: #-nous créons un nouveau curseur pour chaque PolyGUID qui ne renverra que des lignes pour ce GUID sql = " "PolyGUID" = '%s'" % guid rows = arcpy.UpdateCursor(shp, sql, "#", "#", "FMEAS2 A") x = 0 pour la ligne dans les lignes : if x == 0 : #-ignorer le premier enregistrement (puisque trié par 'FMEAS2', le premier enregistrement est celui que nous voulons) x += 1 else : #-si plusieurs enregistrements avec le même PolyGUID , supprimez-les print "Suppression : %s %s" % (row.PolyGUID,row.FMEAS2) rows.deleteRow(row) del rows

Voir la vidéo: Arcpy Data Access Module Update Cursor