2 votos

Un nombre de campo incorrecto ha provocado un RuntimeError: ERROR 999999 (Además, mejor código para añadir y calcular campos)

Esta es la mitad inferior de mi código (y ha sido editado un poco para compartirlo públicamente). El código funciona perfectamente bien cuando el fieldList sólo tiene tres campos, pero cuando lo relleno con los 108 campos, recibo el siguiente error, justo antes de que empiece a calcular los campos:

Traceback (most recent call last):
  File "C:\GIS\1GIS_DATA\Folder1\Folder2\Python and Tools\RunThisPythonCode.py", line 125, in <module>
    value = row.getValue(field)* row.anotherField #<--This is the line the error is referring to
  File "C:\Program Files\ArcGIS\Desktop10.0\arcpy\arcpy\arcobjects\arcobjects.py", line 944, in getValue
    return convertArcObjectToPythonObject(self._arc_object.GetValue(*gp_fixargs(args)))
RuntimeError: ERROR 999999: Error executing function.

Aquí está el código:

....

fc = arcpy.CopyFeatures_management(layerName, outFeatures)

#---------------------------------------------
# Add fields to a feature class:
#---------------------------------------------
fieldList = ["field1", "field2", "field3", ............., "field99"]  #<-- fieldList
fieldListx = []
for f in fieldList:
    fieldx = f+"x"
    arcpy.AddField_management(fc, fieldx, "DOUBLE")
    fieldListx.append(fieldx)

#---------------------------------------------
# Calculate fields:
#---------------------------------------------
rows = arcpy.UpdateCursor(fc)
for row in rows:
    for fieldx in fieldListx:
        field = fieldx.rstrip('x')
        value = row.getValue(field)* row.anotherField  #<--This is the line the error is referring to
        row.setValue(fieldx,value)
    rows.updateRow(row)
del row, rows

¿Es un problema de memoria o algo así? ¿Por qué se produce un error antes de Calcular campos cuando añado la lista completa de 108 campos, pero no cuando ejecuto una pequeña muestra de sólo 3? Gracias.

3voto

Steven Puntos 106

OK, hay dos soluciones a lo anterior. Voy a pegar las dos a continuación... Gracias a todos por vuestra ayuda.

Al final el problema FUE con un nombre de campo. Mi campo #11 había perdido en algún momento su última letra. Cuando se añadía a fieldList y más tarde se le pidió que se "despojara" de la "x" que se le había añadido, estaba buscando un campo en la clase de característica que no existía. A pesar de que localizar ese problema fue como encontrar una aguja en un pajar, lo arreglé y no volví a recibir el error. Lección aprendida: ¡¡¡comprueba siempre los nombres de los campos!!!

A continuación, sin embargo, son "soluciones" simplemente a escribir mejor código para hacer lo que yo estaba tratando de hacer más arriba:

Solución nº 1:
Este es el mejor. Requiere menos líneas y funciona más rápido. Es el resultado de una sugerencia de @ccn en esta entrada . Lo he retocado ligeramente incluyendo comillas alrededor del nombre del campo estático UNpctOfEd .

....

fc = arcpy.CopyFeatures_management(layerName, outFeatures)

fieldList = ["field1", "field2", "field3", ............., "field105"]  #<-- this has to be done manually for various reasons so I can't just use ListFields

# Loop through fieldList (Add and Calculate fields)
for field in fieldList:
    # local variables
    fieldx = field + "x"
    expression = "!" + field + "! * !" + "UNpctOfEd" + "!" #<-- Jackpot!! Figuring out how to write the expression
    # add/calculate new field
    arcpy.AddField_management(fc, fieldx, "DOUBLE")
    arcpy.CalculateField_management(fc, fieldx, expression, "PYTHON_9.3")

Solución nº 2:
Esta es una versión que funciona/mucho mejor de la que tenía en la pregunta anterior, utilizando UpdateCursor aunque requiere más líneas, es más complicada y es más lenta que la Solución nº 1:

....

fc = arcpy.CopyFeatures_management(layerName, outFeatures)

fieldList = ["field1", "field2", "field3", ............., "field105"]  #<-- again, this has to be done manually for various reasons so I can't just use ListFields

# Creating new fields in the feature class
fieldListx = []
for f in fieldList:
    fieldx = f+"x"
    arcpy.AddField_management(fc, fieldx, "DOUBLE")
    fieldListx.append(fieldx)
print fieldListx

# Calculating those new fields in the feature class
for fieldx in fieldListx:
    rows = arcpy.UpdateCursor(fc)
    field = fieldx.rstrip('x')
    for row in rows:
        value = row.getValue(field)* row.UNpctOfEd 
        row.setValue(fieldx,value)
        rows.updateRow(row)
    del row, rows

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X