Select to view content in your preferred language

using if then statement to check for empty out from find identical tool

248
4
Jump to solution
2 weeks ago
Laura_m_Conner
Regular Contributor

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

0 Kudos
1 Solution

Accepted Solutions
TonyAlmeida
MVP Regular Contributor

 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}")

View solution in original post

4 Replies
DanPatterson
MVP Esteemed Contributor

GetCount ? should work

Get Count (Data Management)—ArcGIS Pro | Documentation

 


... sort of retired...
0 Kudos
TonyAlmeida
MVP Regular Contributor

 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}")
HaydenWelch
MVP Regular Contributor

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:
    ...
0 Kudos
Laura_m_Conner
Regular Contributor

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