So I want to get the number of records in table1 returned first by an UpdateCursor and then in table2 get the number of records returned by a SearchCursor. My code uses GetCount_management and works fine getting the number of rows returned for the first table. For the second table, I try this same process, but I am not getting the number of selected records, I get the TOTAL number of records in the table which I dont care about. I know I've seen this happen before but can't remember why it's happening. Thanks in advance for the help.
with arcpy.da.UpdateCursor(inPtMeasureTbl,("STREAM_CODE","SPECSTR","TYPE","MEAS","PROB"), "TYPE = 'MIDSP' " ) as mainCursor: result = arcpy.GetCount_management(inPtMeasureTbl) count = int(result.getOutput(0)) print count #this works fine for curRec in mainCursor: #print "Working on AWC_CODE: %s Specstr: %s Meas: %f" % (curRec[0], curRec[1], curRec[3]) #Compare to # of line events occurring at this spot srchExpr = "STREAM_CODE='%s' and F_MEAS <= %f and T_MEAS >= %f" % (curRec[0], curRec[3],curRec[3] ) with arcpy.da.SearchCursor(inEventTbl,("STREAM_CODE","SPECLS","F_MEAS","T_MEAS"), srchExpr) as lkupCursor: numLineEvents = int(arcpy.GetCount_management(inEventTbl).getOutput(0)) print numLineEvents #THIS NUMBER IS THE TOTAL WHICH IS WRONG for curEventTbl in lkupCursor: print "Found event: %s Specstr: %s Measures: %f , %f" % (curEventTbl[0],curEventTbl[1], curEventTbl[2], curEventTbl[3])
Solved! Go to Solution.
I would expect the second issue you're seeing because the creation of the cursor has no effect on the source data. I would also assume that the count you're getting for the first cursor is wrong unless your data happens to match the filter in the cursor. Have you tried creating a feature layer against the data using the filters you're providing to the cursor? Otherwise you can iterate through the cursor and get the count prior to looping through it again. I wrote up examples of this below, but note I didn't test either of these. They're just how I'm thinking this would work.
Option A - Get the count using a table view or feature layer
ufields = ("STREAM_CODE","SPECSTR","TYPE","MEAS","PROB") ufilter = "TYPE = 'MIDSP'" with arcpy.da.UpdateCursor(inPtMeasureTbl, ufields, ufilter) as ucursor: utview = arcpy.management.MakeTableView(inPtMeasureTbl, "utable", ufilter) ucount = int(arcpy.management.GetCount(uview).getOutput(0)) for urow in ucursor: cfields = ("STREAM_CODE","SPECLS","F_MEAS","T_MEAS") cfilter = "STREAM_CODE='{}' and F_MEAS <= {:.6f} and T_MEAS >= {:.6f}".format(*[urow[0], urow[3], urow[3]]) with arcpy.da.SearchCursor(inEventTbl, cfields, cfilter) as ccursor: ctview = arcpy.management.MakeTableView(inEventTbl, "ctable", cfilter) ccount = int(arcpy.management.GetCount(ctview).getOutput(0)) print("Line Events Count: {0}".format(count)) for crow in ccursor: print("Found event: {} Specstr: {} Measures: {:.6f} , {:.6f}".format(*row))
Option B - Get the count from the cursor
ufields = ("STREAM_CODE","SPECSTR","TYPE","MEAS","PROB") ufilter = "TYPE = 'MIDSP'" with arcpy.da.UpdateCursor(inPtMeasureTbl, ufields, ufilter) as ucursor: ucount = 0 for _ in ucursor: ucount += 1 ucursor.reset() for urow in ucursor: cfields = ("STREAM_CODE","SPECLS","F_MEAS","T_MEAS") cfilter = "STREAM_CODE='{}' and F_MEAS <= {:.6f} and T_MEAS >= {:.6f}".format(*[urow[0], urow[3], urow[3]]) with arcpy.da.SearchCursor(inEventTbl, cfields, cfilter) as ccursor: ccount = 0 for _ in ccursor: ccount += 1 ccursor.reset() print("Line Events Count: {0}".format(count)) for crow in ccursor: print("Found event: {} Specstr: {} Measures: {:.6f} , {:.6f}".format(*row))
I would expect the second issue you're seeing because the creation of the cursor has no effect on the source data. I would also assume that the count you're getting for the first cursor is wrong unless your data happens to match the filter in the cursor. Have you tried creating a feature layer against the data using the filters you're providing to the cursor? Otherwise you can iterate through the cursor and get the count prior to looping through it again. I wrote up examples of this below, but note I didn't test either of these. They're just how I'm thinking this would work.
Option A - Get the count using a table view or feature layer
ufields = ("STREAM_CODE","SPECSTR","TYPE","MEAS","PROB") ufilter = "TYPE = 'MIDSP'" with arcpy.da.UpdateCursor(inPtMeasureTbl, ufields, ufilter) as ucursor: utview = arcpy.management.MakeTableView(inPtMeasureTbl, "utable", ufilter) ucount = int(arcpy.management.GetCount(uview).getOutput(0)) for urow in ucursor: cfields = ("STREAM_CODE","SPECLS","F_MEAS","T_MEAS") cfilter = "STREAM_CODE='{}' and F_MEAS <= {:.6f} and T_MEAS >= {:.6f}".format(*[urow[0], urow[3], urow[3]]) with arcpy.da.SearchCursor(inEventTbl, cfields, cfilter) as ccursor: ctview = arcpy.management.MakeTableView(inEventTbl, "ctable", cfilter) ccount = int(arcpy.management.GetCount(ctview).getOutput(0)) print("Line Events Count: {0}".format(count)) for crow in ccursor: print("Found event: {} Specstr: {} Measures: {:.6f} , {:.6f}".format(*row))
Option B - Get the count from the cursor
ufields = ("STREAM_CODE","SPECSTR","TYPE","MEAS","PROB") ufilter = "TYPE = 'MIDSP'" with arcpy.da.UpdateCursor(inPtMeasureTbl, ufields, ufilter) as ucursor: ucount = 0 for _ in ucursor: ucount += 1 ucursor.reset() for urow in ucursor: cfields = ("STREAM_CODE","SPECLS","F_MEAS","T_MEAS") cfilter = "STREAM_CODE='{}' and F_MEAS <= {:.6f} and T_MEAS >= {:.6f}".format(*[urow[0], urow[3], urow[3]]) with arcpy.da.SearchCursor(inEventTbl, cfields, cfilter) as ccursor: ccount = 0 for _ in ccursor: ccount += 1 ccursor.reset() print("Line Events Count: {0}".format(count)) for crow in ccursor: print("Found event: {} Specstr: {} Measures: {:.6f} , {:.6f}".format(*row))
Thanks Freddie,
your first sentence was indeed fundamental to my problem:
"I would expect the second issue you're seeing because the creation of the cursor has no effect on the source data. I would also assume that the count you're getting for the first cursor is wrong unless your data happens to match the filter in the cursor." I tested out that theory and indeed, the cursor has no effect on source data.
I had already implemented a manual counter as a work around - your "Option B" which of course works.