I've been struggling to emulate a simple Field Calculator function as pyscript. When I try, I get parsing errors.
For example, how should this simple function (when manually applied in the Field Calculator tool) look when written up as pyscript?
In Pre-Logic Script Code:
def LookUp ( a, b ) :
if ( a == 0 ) :
newval = 0
else :
newval = b
return newval
In FIELD =
LookUp ( !MAX_RANK!, !Shape_Area! )
Any advice will be much appreciated.
Solved! Go to Solution.
I have made it work!!!!!!
Code I used:
# Populate SUBJECT_AREA only if there is a Rank shown in MAX_RANK field.
expression = "LookUp(!MAX_RANK!, !Shape_Area!)"
codeblock = "def LookUp(MAX_RANK, Shape_Area):\n\
if MAX_RANK == 0:\n\
return 0\n\
else:\n\
return Shape_Area"
gp.CalculateField_management(currentWorkspace + "/myDataset", "SUBJECT_AREA", expression, "PYTHON", codeblock)
Try this... if there are any errors it is because I can't test it from an iThingy since you can't run Arc* stuff on them
You basically want an update cursor
UpdateCursor—Help | ArcGIS for Desktop
import arcpy fc = "c:/path_to/Your_gdb/my.gdb/yourlayer" field1 = "Shape_Area" field2 = "MAX_RANK" calc_fld = "Calculate_field" cursor = arcpy.UpdateCursor(fc) row = cursor.next() while row: # field2 will be equal to field1 multiplied by 3.0 if row.getValue(field1) == 0.0: row.setValue(0.0) else: row.setValue(calc_fld, row.getValue(field1)) cursor.updateRow(row) row = cursor.next()
Thanks Dan.
I've just tried this following your advice and sadly it returned a runtime error:
fc = currentWorkspace + "/dataset"
field1 = "MAX_RANK"
field2 = "Shape_Area"
calc_fld = "Calculate_field"
cursor = arcpy.UpdateCursor(fc)
row = cursor.next()
while row:
if row.getValue(field1) == 0:
row.setValue(0)
else:
row.setValue(calc_fld, row.getValue(field2))
cursor.updateRow(row)
row = cursor.next()
Runtime error
Traceback (most recent call last):
File "<string>", line 35, in <module>
File "c:\program files (x86)\arcgis\desktop10.1\arcpy\arcpy\arcobjects\arcobjects.py", line 1040, in setValue
return convertArcObjectToPythonObject(self._arc_object.SetValue(*gp_fixargs(args)))
AttributeError: Row: Error in parsing arguments for SetValue
I'll keep chipping away at it.
The simplest way to get the proper syntax is to use your calculation in model builder then export as python script.
Wes... which assumes the model works first go... but based on the number of model failures on this site, that would be my last choice
Thanks Wes. I tried this and it returned:
Failed to execute. Parameters are not valid.
ERROR 000989: Python syntax error: Parsing error SyntaxError: invalid syntax (line 1)
Failed to execute (CalculateField).
Could you post a screen shot of the model builder field calculator.
I have made it work!!!!!!
Code I used:
# Populate SUBJECT_AREA only if there is a Rank shown in MAX_RANK field.
expression = "LookUp(!MAX_RANK!, !Shape_Area!)"
codeblock = "def LookUp(MAX_RANK, Shape_Area):\n\
if MAX_RANK == 0:\n\
return 0\n\
else:\n\
return Shape_Area"
gp.CalculateField_management(currentWorkspace + "/myDataset", "SUBJECT_AREA", expression, "PYTHON", codeblock)