2016-04-18 7 views
0

Verwenden von ArcDesktop 10.1 & Python 2.7: Ich arbeite an einem Code, der nach Werten innerhalb von 13 Feldern sucht und basierend auf dem, was er in diesen 13 Feldern findet, verkettet er eine Zeichenfolge Ergebnis in einem vorhandenen (leeren) Feld.Fehler beim Verwenden von UpdateCursor beim Festlegen des Werts

Es verwendet einen Suchcursor, um die 13 Felder zu suchen. Verwendet dann das Ergebnis davon in einem Aktualisierungscursor, um die Zeichenfolge zu verketten.

Ich habe Probleme, das Ergebnis in das Feld mit dem setValue - Zeile 40 des Codes unter @ urow.setValue (commentsField, easementType) zu bekommen. Die Fehlermeldung ist sehr hilfreich (RuntimeError: ERROR 999999: Fehler beim Ausführen der Funktion.)

Ich bin mir nicht sicher, wie Sie den Wert korrekt in das gewünschte Feld eingeben. Jede Hilfe würde sehr geschätzt werden!

import arcpy, os, math 
from itertools import izip 
arcpy.env.workspace = "C:\\Users\\mdelgado\\Desktop\\WorkinDog.gdb" 

#These are my variables 
fc = "EASEMENTS" 
commentsField = "Comments" 
typeFields = ["ABANDONED", "ACCESS", "AERIAL", "BLANKET", "COMM", "DRAIN", "ELEC", "GEN_UTIL", "LANDSCAPE", "PARKING", "PIPELINE", "SAN_SEWR", "SIDEWALK", "SPECIAL", "STM_SEWR", "WATER"] 
fieldNames = ["ABANDONED", "ACCESS", "AERIAL", "BLANKET", "COMMUNICATION", "DRAINAGE", "ELECTRIC", "GENERAL UTILITY", "LANDSCAPE", "PARKING", "PIPELINE", "SANITATION SEWER", "SIDEWALK", "SPECIAL", "STORM SEWER", "WATER"] 
fieldValues = [] 
easementType = "" 

#This is my search cursor 
scursor = arcpy.SearchCursor(fc) 
srow = scursor.next() 
for field in typeFields: 
    srowValue = (srow.getValue(field)) 
    fieldValues.append(srowValue) 
    srow = scursor.next() 
print fieldValues 

#This is my update cursor 
ucursor = arcpy.UpdateCursor(fc) 
for urow in ucursor: 

    #This is where I begin the loop to concatenate the comment field 
    for (value, name) in izip(fieldValues, fieldNames): 
     print str(value) + " " + name 

     #This is where I check each field to find out which types the easement is 
     if value == 1: 
      easementType = easementType + name + ", " 

    #This is where I format the final concatenated string 
    easementType = easementType[:-2] 
    print easementType 

    #This is where the field is updated with the final string using the cursor 
    urow.setValue(commentsField, easementType) 
    ucursor.updateRow(urow) 
    urow = cursor.next() 

del urow 
del ucursor 
del srow 
del scursor 
+0

Ist es korrekt ausführen, für einige Zeilen und dann brechen? Haben Sie überprüft, dass die Länge des Felds "Kommentare" ausreicht, um den längsten möglichen verketteten "Dienstbarkeitstyp" unterzubringen? – Erica

+1

Großer Vorschlag! Als ich das betrachtete, entdeckte ich, dass ich auf einen Feldalias und nicht auf den tatsächlichen Feldnamen Bezug nahm. Das hat ein Problem gelöst. –

Antwort

0

Der uninformative 999999 Fehler ist einer der schlimmsten.

Ich empfehle einige Änderungen an Ihrem Ansatz, die die Fehlersuche erleichtern können. Erstens, use the da Cursors - sie sind schneller, und die Syntax ist ein wenig einfacher.

Zweitens brauchen Sie keine separate Suche und Aktualisierung - das Update kann andere Felder in derselben Zeile zusätzlich zu den Feldern suchen. (Der aktuelle Code, vorausgesetzt, es wurde richtig funktioniert, würde die UpdateCursor betroffen die gleichen fieldValues in jede Zeile werden Putten.)

fieldNames = ["ABANDONED", "ACCESS", "AERIAL", "BLANKET", "COMMUNICATION", "DRAINAGE", 
       "ELECTRIC", "GENERAL UTILITY", "LANDSCAPE", "PARKING", "PIPELINE", "SANITATION SEWER", 
       "SIDEWALK", "SPECIAL", "STORM SEWER", "WATER"] 
cursorFields = ["ABANDONED", "ACCESS", "AERIAL", "BLANKET", "COMM", "DRAIN", 
       "ELEC", "GEN_UTIL", "LANDSCAPE", "PARKING", "PIPELINE", "SAN_SEWR", 
       "SIDEWALK", "SPECIAL", "STM_SEWR", "WATER", "Comments"] 

with arcpy.da.UpdateCursor(fc, cursorFields) as cursor: 
    for row in cursor: 
     easementType = "" 
     for x in range(13): 
      if row[x] == 1: 
       easementType += fieldNames[x] + ", " 
     easementType = easementType[:-2] 
     print easementType 

     row[13] = easementType 
     cursor.updateRow(row) 
+0

Diese Modifikationen sind brilliant! Sie haben alle meine Probleme gelöst. Das Skript läuft jetzt einwandfrei. Ich kann dir nicht genug für deinen Rat danken! –

+0

Gern geschehen :) – Erica