All,
In arc pro I am developing a script to check for duplicates in a field for several layers. I have gotten the check to run in the loop with no issues. After the find identical tool runs i want to use a if then statement to check if the out put is blank and if it is not join the tables. How do i do this? It is failing at line 17. My code is
F=("feature1","feature2","feature3","feature14")
b =0
for e in F:
a=F[b]
s=str(a).replace(" ", "_")
o= "C:\\path\\way\\ArcGIS\\Projects\\edit_map6\\edit_map6.gdb\\" +s+"_findidencal"
arcpy.management.FindIdentical(
in_dataset= a,
out_dataset=o,
fields="FACILITYID",
xy_tolerance=None,
z_tolerance=0,
output_record_option="ONLY_DUPLICATES"
)
if o is not empty:
arcpy.management.AddJoin(
in_layer_or_view=a,
in_field="OBJECTID",
join_table=o,
join_field="IN_FID",
join_type="KEEP_ALL",
index_join_fields="NO_INDEX_JOIN_FIELDS",
rebuild_index="NO_REBUILD_INDEX",
join_operation="JOIN_ONE_TO_FIRST"
)
#print result
b=b+1
Laura
Solved! Go to Solution.
I would use GetCount_management() .
Maybe something like this...
# Get count of duplicates
count_result = arcpy.management.GetCount(o)
count = int(count_result[0])
print(f"\nFeature class: {a}")
print(f"Number of duplicates found: {count}")
if count > 0:
# Print duplicate rows
print("Duplicate entries:")
with arcpy.da.SearchCursor(o, ["FID", "FEAT_SEQ"]) as cursor:
for row in cursor:
print(f" FID: {row[0]}, FEAT_SEQ: {row[1]}")
# Optional: Join duplicates to original layer
arcpy.management.AddJoin(
in_layer_or_view=a,
in_field="OBJECTID",
join_table=o,
join_field="IN_FID",
join_type="KEEP_ALL",
index_join_fields="NO_INDEX_JOIN_FIELDS",
rebuild_index="NO_REBUILD_INDEX",
join_operation="JOIN_ONE_TO_FIRST"
)
or
if int(arcpy.GetCount_management(o).getOutput(0)) > 0:
arcpy.management.AddJoin(
in_layer_or_view=a,
in_field="OBJECTID",
join_table=o,
join_field="IN_FID",
join_type="KEEP_ALL",
index_join_fields="NO_INDEX_JOIN_FIELDS",
rebuild_index="NO_REBUILD_INDEX",
join_operation="JOIN_ONE_TO_FIRST"
)
print(f"Joined duplicates from {o} to {a}")
else:
print(f"No duplicates found in {a}")
I would use GetCount_management() .
Maybe something like this...
# Get count of duplicates
count_result = arcpy.management.GetCount(o)
count = int(count_result[0])
print(f"\nFeature class: {a}")
print(f"Number of duplicates found: {count}")
if count > 0:
# Print duplicate rows
print("Duplicate entries:")
with arcpy.da.SearchCursor(o, ["FID", "FEAT_SEQ"]) as cursor:
for row in cursor:
print(f" FID: {row[0]}, FEAT_SEQ: {row[1]}")
# Optional: Join duplicates to original layer
arcpy.management.AddJoin(
in_layer_or_view=a,
in_field="OBJECTID",
join_table=o,
join_field="IN_FID",
join_type="KEEP_ALL",
index_join_fields="NO_INDEX_JOIN_FIELDS",
rebuild_index="NO_REBUILD_INDEX",
join_operation="JOIN_ONE_TO_FIRST"
)
or
if int(arcpy.GetCount_management(o).getOutput(0)) > 0:
arcpy.management.AddJoin(
in_layer_or_view=a,
in_field="OBJECTID",
join_table=o,
join_field="IN_FID",
join_type="KEEP_ALL",
index_join_fields="NO_INDEX_JOIN_FIELDS",
rebuild_index="NO_REBUILD_INDEX",
join_operation="JOIN_ONE_TO_FIRST"
)
print(f"Joined duplicates from {o} to {a}")
else:
print(f"No duplicates found in {a}")
The GetCount function is actually incredibly slow compared to Cursors:
def cursor_len():
return sum(1 for _ in SearchCursor(r'<Feature\Path>', ['OID@']))
def get_count():
return int(GetCount(r'<Feature\Path>').getOutput(0))
>>> %timeit cursor_len()
519 µs ± 7.09 µs per loop (mean ± std. dev. of 7 runs, 1,000 loops each)
>>> %timeit get_count()
156 ms ± 2.32 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
You can parameterize that function and use it place of your `empty` option:
def feature_count(feature: str|arcpy._mp.Layer):
return sum(1 for _ in arcpy.da.SearchCursor(feature, ['OID@']))
...
if feature_count(o) > 0:
...
Thanks the get count worked. here is my final code:
F=("Sanitary Sewer Manholes","Water Network Structures","Water Fittings","Water System Valves","Water Service Connections","Water Hydrants","Sewer Gravity Mains","Sewer Pressurized Mains","Storm Drain Pipes", "Water Lateral Lines", "Water Mains")
b =0
for e in F:
a=F[b]
s=str(a).replace(" ", "_")
o= "C:\\Users\\lconner\\Documents\\ArcGIS\\Projects\\edit_map6\\edit_map6.gdb\\" +s+"_findidencal"+str(7)
arcpy.management.FindIdentical(
in_dataset= a,
out_dataset=o,
fields="FACILITYID",
xy_tolerance=None,
z_tolerance=0,
output_record_option="ONLY_DUPLICATES")
count_result = arcpy.management.GetCount(o)
count = int(count_result[0])
if count > 0:
print("Duplicate entries in"+str (a) )
print(f"Number of duplicates found: {count}")
arcpy.management.AddJoin(
in_layer_or_view=a,
in_field="OBJECTID",
join_table=o,
join_field="IN_FID",
join_type="KEEP_ALL",
index_join_fields="NO_INDEX_JOIN_FIELDS",
rebuild_index="NO_REBUILD_INDEX",
join_operation="JOIN_ONE_TO_FIRST"
)
arcpy.management.SelectLayerByAttribute(
in_layer_or_view= a,
selection_type="NEW_SELECTION",
where_clause="IN_FID IS NOT NULL",
invert_where_clause=None
)
else:
print("no Duplicate in " + str(a) )
b=b+1