FieldNameList = ["CATTLE", "DAIRY", "POULTRY", "SWINE"] Iteration = 0 Iteration2 = 0 if TABLETYPE == "Animal Operations": for JoinFile in UPDATELIST_join: if Iteration > 2: Iteration = 0 Iteration2 = Iteration2 + 1 layer = CENSUSLayerLIST[Iteration] ANOPSFIELD = FieldNameList[Iteration2] arcpy.AddJoin_management(layer, "GEOID10_1", JoinFile, "GEOID10_1", "KEEP_COMMON") arcpy.CalculateField_management(layer, ANOPSFIELD, "!NumCount!", "PYTHON_9.3") arcpy.RemoveJoin_management(layer) Iteration = Iteration + 1 else: for layer in CENSUSLayerLIST: JoinFile = UPDATELIST_join[Iteration] arcpy.AddJoin_management(layer, "GEOID10_1", JoinFile, "GEOID10_1", "KEEP_COMMON") arcpy.CalculateField_management(layer, CENSUSFIELDTRANS, "!NumCount!", "PYTHON_9.3") arcpy.RemoveJoin_management(layer) Iteration = Iteration + 1
Solved! Go to Solution.
Now, just so that I understand what is happening here,
Code:valueDict = {r[0]:(r[1:]) for r in arcpy.da.SearchCursor(JoinFile, readList)}
valueDict = { field_1 : [ field_2, field_3, field_4] }
is building an array from which
Code:with arcpy.da.UpdateCursor(layer, updateList) as cursor: for row in cursor: GEOIDval = row[0] if GEOIDval in valueDict: row[1] = valueDict[GEOIDval][0] cursor.updateRow(row)
the current cursor row searches for a match. And
Code:
row[1] = valueDict[GEOIDval][0]
means the value of the update cursor row's second field (row[1]) now equals the matched object's next value from the matched part (valueDict[GEOIDval][0]). Correct?
SCRIPTPATH = sys.path[0]
ROOTFOLDER = os.path.dirname(SCRIPTPATH)
CENSUS_FGDB = os.path.join(ROOTFOLDER, "CENSUS.gdb")
Census_Blocks = os.path.join(ROOTFOLDER, "CENSUS.gdb\CENSUS_BLOCKS")
Census_Group = os.path.join(ROOTFOLDER, "CENSUS.gdb\CENSUS_GROUP")
Grid = os.path.join(ROOTFOLDER, "CENSUS.gdb\CENSUS_GRID")
CENSUSLIST = [Census_Blocks, Census_Group, Grid]
TABLETYPE = arcpy.GetParameterAsText(0)
UPDATELAYER = arcpy.GetParameterAsText(1)
UPDATEFIELD = arcpy.GetParameterAsText(2)# optional
CENSUSFIELD = arcpy.GetParameterAsText(3)# optional
usrName = os.getenv('USERNAME')
HOME = r'C:\Users\%s' % usrName
if CENSUSFIELD == "Buildings":
CENSUSFIELDTRANS = "BLDCNT"
elif CENSUSFIELD == "Chemical Sites":
CENSUSFIELDTRANS = "CHEMICAL"
elif CENSUSFIELD == "Correctional Facilities":
CENSUSFIELDTRANS = "CORRECT"
elif CENSUSFIELD == "Dams":
CENSUSFIELDTRANS = "DAMS"
else:
pass
if UPDATEFIELD =='#' or not UPDATEFIELD:
UPDATEFIELD = "NOTUSED"
DEFAULTGDB = os.path.join(HOME, "Documents", "ArcGIS", "Default.gdb")
UPDATELAYERTemp = (os.path.join(DEFAULTGDB, "UPDATELAYERTemp"))
desc = arcpy.Describe(UPDATELAYER)
type = desc.shapeType
arcpy.CopyFeatures_management(UPDATELAYER, UPDATELAYERTemp)
# List Fields and delete unnecessary
fields = arcpy.ListFields(UPDATELAYERTemp)
fieldNameList = []
for field in fields:
if not field.required and not field.name == UPDATEFIELD:
fieldNameList.append(field.name)
arcpy.DeleteField_management(UPDATELAYERTemp, fieldNameList)
arcpy.AddField_management(UPDATELAYERTemp,"Number","SHORT")
arcpy.CalculateField_management(UPDATELAYERTemp,"Number",1,"PYTHON_9.3")
# Define Animal Operations
ANOPCATTLE = (os.path.join(DEFAULTGDB, "ANOPCATTLE"))
ANOPDAIRY = (os.path.join(DEFAULTGDB, "ANOPDAIRY"))
ANOPPOULTRY = (os.path.join(DEFAULTGDB, "ANOPPOULTRY"))
ANOPSWINE = (os.path.join(DEFAULTGDB, "ANOPSWINE"))
exp1 = "\"" + UPDATEFIELD + "\" LIKE '%Dry%' OR \"" + UPDATEFIELD + "\" LIKE '%Beef%'"
exp2 = "\"" + UPDATEFIELD + "\" LIKE '%Dairy%' OR \"" + UPDATEFIELD + "\" LIKE '%Milk%'"
exp3 = "\"" + UPDATEFIELD + "\" LIKE '%Poultry%'"
exp4 = "\"" + UPDATEFIELD + "\" LIKE '%Swine%'"
# Define Census Layers
CENSUS_Blocks_Layer = (os.path.join(DEFAULTGDB, "CENSUS_Blocks_Layer"))
CENSUS_Group_Layer = (os.path.join(DEFAULTGDB, "CENSUS_Group_Layer"))
CENSUS_Grid_Layer = (os.path.join(DEFAULTGDB, "CENSUS_Grid_Layer"))
CENSUSLayerLIST = [CENSUS_Blocks_Layer, CENSUS_Group_Layer, CENSUS_Grid_Layer]
# Make Feature Layers from Census
Iteration = 0
for layer in CENSUSLIST:
Newlayer = CENSUSLayerLIST[Iteration]
arcpy.MakeFeatureLayer_management(layer, Newlayer)
Iteration = Iteration + 1
#Define Spatial Join outputs for
UPDATELIST_join = []
CENSUS = ["Blocks", "Group", "Grid"]
if TABLETYPE == "Animal Operations":
arcpy.Select_analysis(UPDATELAYERTemp, ANOPCATTLE, exp1)
arcpy.Select_analysis(UPDATELAYERTemp, ANOPDAIRY, exp2)
arcpy.Select_analysis(UPDATELAYERTemp, ANOPPOULTRY, exp3)
arcpy.Select_analysis(UPDATELAYERTemp, ANOPSWINE, exp4)
JOINLAYERList = [ANOPCATTLE, ANOPDAIRY, ANOPPOULTRY, ANOPSWINE]
else:
JOINLAYERList = [UPDATELAYERTemp]
if TABLETYPE == "Lagoons":
field_name = UPDATEFIELD
CENSUSFIELDTRANS = "LAGOONS"
else:
field_name = "Number"
for file in JOINLAYERList:
Iteration = 0
for layer in CENSUSLayerLIST:
Export_Output = file + "_" + CENSUS[Iteration]
UPDATELIST_join.append(Export_Output)
fieldmappings = arcpy.FieldMappings()
fieldmappings.addTable(layer)
fieldmappings.addTable(file)
FieldIndex = fieldmappings.findFieldMapIndex(field_name)
fieldmap = fieldmappings.getFieldMap(FieldIndex)
field = fieldmap.outputField
field.name = "NumCount"
field.aliasName = "NumCount"
fieldmap.outputField = field
fieldmap.mergeRule = "sum"
fieldmappings.replaceFieldMap(FieldIndex, fieldmap)
for field in fieldmappings.fields:
if field.name not in ["NumCount", "GEOID10_1", "GEOID10_3"]:
fieldmappings.removeFieldMap(fieldmappings.findFieldMapIndex(field.name))
arcpy.SpatialJoin_analysis(layer, file, Export_Output, "#","#", fieldmappings)
with arcpy.da.UpdateCursor(Export_Output, "NumCount") as cursor:
for row in cursor:
if row[0] is None:
cursor.deleteRow()
Iteration = Iteration + 1
FieldNameList = ["CATTLE", "DAIRY", "POULTRY", "SWINE"]
Iteration = 0
Iteration2 = 0
if TABLETYPE == "Animal Operations":
for JoinFile in UPDATELIST_join:
if Iteration > 2:
Iteration = 0
Iteration2 = Iteration2 + 1
layer = CENSUSLayerLIST[Iteration]
ANOPSFIELD = FieldNameList[Iteration2]
arcpy.AddJoin_management(layer, "GEOID10_1", JoinFile, "GEOID10_1", "KEEP_COMMON")
arcpy.AddMessage("Updateing " + layer + "' " + ANOPSFIELD)
arcpy.CalculateField_management(layer, ANOPSFIELD, "!NumCount!", "PYTHON_9.3")
arcpy.RemoveJoin_management(layer)
Iteration = Iteration + 1
else:
for layer in CENSUSLayerLIST:
JoinFile = UPDATELIST_join[Iteration]
arcpy.AddJoin_management(layer, "GEOID10_1", JoinFile, "GEOID10_1", "KEEP_COMMON")
arcpy.AddMessage("Updateing " + layer + "' " + CENSUSFIELDTRANS)
arcpy.CalculateField_management(layer, CENSUSFIELDTRANS, "!NumCount!", "PYTHON_9.3")
arcpy.RemoveJoin_management(layer)
Iteration = Iteration + 1
FieldNameList = ["CATTLE", "DAIRY", "POULTRY", "SWINE"]
Iteration = 0
Iteration2 = 0
if TABLETYPE == "Animal Operations":
for JoinFile in UPDATELIST_join:
if Iteration > 2:
Iteration = 0
Iteration2 = Iteration2 + 1
layer = CENSUSLayerLIST[Iteration]
ANOPSFIELD = FieldNameList[Iteration2]
readList = ["GEOID10_1", "NumCount"]
valueDict = {r[0]:(r[1:]) for r in arcpy.da.SearchCursor(JoinFile, readList)}
updateList = ["GEOID10_1", ANOPSFIELD]
with arcpy.da.UpdateCursor(layer, updateList) as cursor:
for row in cursor:
GEOIDval = row[0]
if GEOIDval in valueDict:
row[1] = valueDict[GEOIDval][0]
cursor.updateRow(row)
Iteration = Iteration + 1
else:
for layer in CENSUSLayerLIST:
JoinFile = UPDATELIST_join[Iteration]
readList = ["GEOID10_1", "NumCount"]
valueDict = {r[0]:(r[1:]) for r in arcpy.da.SearchCursor(JoinFile, readList)}
updateList = ["GEOID10_1", CENSUSFIELDTRANS]
with arcpy.da.UpdateCursor(layer, updateList) as cursor:
for row in cursor:
GEOIDval = row[0]
if GEOIDval in valueDict:
row[1] = valueDict[GEOIDval][0]
cursor.updateRow(row)
Iteration = Iteration + 1
valueDict = {r[0]:(r[1:]) for r in arcpy.da.SearchCursor(JoinFile, readList)}with arcpy.da.UpdateCursor(layer, updateList) as cursor: for row in cursor: GEOIDval = row[0] if GEOIDval in valueDict: row[1] = valueDict[GEOIDval][0] cursor.updateRow(row)
row[1] = valueDict[GEOIDval][0]
Now, just so that I understand what is happening here,
Code:valueDict = {r[0]:(r[1:]) for r in arcpy.da.SearchCursor(JoinFile, readList)}
valueDict = { field_1 : [ field_2, field_3, field_4] }
is building an array from which
Code:with arcpy.da.UpdateCursor(layer, updateList) as cursor: for row in cursor: GEOIDval = row[0] if GEOIDval in valueDict: row[1] = valueDict[GEOIDval][0] cursor.updateRow(row)
the current cursor row searches for a match. And
Code:
row[1] = valueDict[GEOIDval][0]
means the value of the update cursor row's second field (row[1]) now equals the matched object's next value from the matched part (valueDict[GEOIDval][0]). Correct?