2013-04-04 217 views
2

我对Python很陌生,并且正在尝试编写用于ArcGIS 10.1(arcpy)的脚本;基本的想法是添加一个新的字段(弗朗西斯),检查其他几个字段的值,如果有任何值为空(-99),那么输出0到弗朗西斯,否则运行一个简单的计算。但是,我得到这个错误,我有麻烦超越它:“value is Required”在arcpy.CalculateField

Traceback (most recent call last):

File "C:\gislab2\Python\take_home\part1\prelim_if2.py", line 28, in arcpy.CalculateField_management(Output_Feature_Class, "Francis", "", "PYTHON_9.3", "")

File "C:\Program Files\ArcGIS\Desktop10.1\arcpy\arcpy\management.py", line 3128, in CalculateField raise e

ExecuteError: Failed to execute. Parameters are not valid. ERROR 000735: Expression: Value is required Failed to execute (CalculateField).

下面的代码

# Import arcpy module 
import arcpy 

print "start your engines" 
# Script arguments 
Shapefile = "C:\\gislab2\\Python\\take_home\\USCancer2000.shp" 

Field_Name = Francis 

Output_Feature_Class = "C:\\gislab2\\Python\\take_home\\USCancer2000.shp" 

# Local variables: 
USCancer2000__2_ = Output_Feature_Class 

# Process: Add Field 
arcpy.AddField_management(Shapefile, "Francis", "LONG", "", "", "", "", "NULLABLE", "NON_REQUIRED", "") 

# Process: Calculate Field 
arcpy.CalculateField_management(Output_Feature_Class, "Francis", "", "PYTHON_9.3", "") 
## 
### Process: If-then check for missing values 
## 
if "Cnt1"==-99: 
    Field_name=7 
elif "Cnt2"==-99: 
    Field_name=7 
elif "Cnt3"==-99: 
    Field_name=7 
elif "Pop1"==-99: 
    Field_name==7 
elif "Pop2"==-99: 
    Field_name=7 
elif "Pop3"==-99: 
    Field_name=7 
else: 
     Field_name=("Cnt1"+"Cnt2"+"Cnt3")/("Pop1"+"Pop2"+"Pop3") 
print "done" 

许多在此先感谢! david

+0

可以显示堆栈跟踪 – karthikr 2013-04-04 23:47:15

+0

回溯(最近通话最后一个): 文件 “C:\ gislab2 \ Python的\ take_home \ part1的\ prelim_if2.py” 28行,在 arcpy.CalculateField_management( Output_Feature_Class,“Francis”,“”,“PYTHON_9.3”,“”) CalculateField中的文件“C:\ Program Files \ ArcGIS \ Desktop10.1 \ arcpy \ arcpy \ management.py”,行3128 raise e ExecuteError:无法执行。参数无效。 错误000735:表达式:值是必需的 无法执行(CalculateField)。 >>>在此先感谢 – 2013-04-04 23:58:42

+1

把它放在你的问题,它可以正确格式,人们可以阅读它! – kindall 2013-04-05 00:02:18

回答

2

arcpy.CalculateField_management中的第三个参数告诉它计算什么。你没有在那里传递任何东西。作为一项测试,用 arcpy.CalculateField_management(Output_Feature_Class, "Francis", 5, "PYTHON_9.3", "")替换该行,看看它是否评估。

一旦它成功运行,那么你应该看看使用表达式和代码块来做你想要的计算。请参阅计算范围(第三个)示例here

--Alternative--

您也可能会发现它更容易使用的updateCursor。这似乎比使用calculateField更多的工作,但它可以快得多,并且节省了编写一个复杂的代码块的麻烦。

# Import arcpy module 
import arcpy 

print "start your engines" 
# Script arguments 
Shapefile = "C:\\gislab2\\Python\\take_home\\USCancer2000.shp" 

Field_Name = "Francis" 

# Process: Add Field 
arcpy.AddField_management(Shapefile, "Francis", "LONG", "", "", "", "", "NULLABLE", "NON_REQUIRED", "") 

fields = ["Cnt1", "Cnt2", "Cnt3", "Pop1", "Pop2", "Pop3", "Francis"] # the fields you want available to you in the cursor 

with arcpy.da.UpdateCursor(shapefile, fields) as cursor: 
    for row in cursor: # step through each row 
     if not -99 in row: # Check for nulls 
      # none found, do the math 
      row[6] = (row[0] + row[1] + row[2])/(row[3] + row[4] + row[5]) 
     else: 
      # nulls found, zero out the result 
      row[6] = 0 
     cursor.updateRow(row) # save it 

print "done" 
相关问题