取得 Arcgis 中字段唯一值

最近多次需要取得要素类中某字段的唯一值,在 arcgis 中的 python 窗口写着也很简单.但每次写,略显麻烦,就想着封装成函数吧.

动起手来,发现为了普适,还是比平时单写复杂些的,不仅可以取得某一字段的唯一值,亦可取得某几个字段联合后的唯一值,代码如下:

# coding:utf-8
import arcpy


def distinct_value(shp, *field):
    """打印出某一个字段的唯一值,或某几个字段联合后的唯一值.

    参数 shp 可以为 shp 数据,可以为地理数据库要素类
    参数 field ,如果只有 1 个可以直接写,如果 1 个以上,需要使用括号括起来,不然报错

    变量 val_union 为要素类中该行中,所需要的所有字段的联合值
    变量 index 为该行中,某一个字段的索引
    变量 field_value 为该行中,某一个字段的值
    """
    distinct = set()
    with arcpy.da.SearchCursor(shp, *field) as cursor:
        for row in cursor:
            val_union = ''
            index = len(row) - 1  # 该行最大索引
            while index >= 0:
            # for i, k in enumerate(row):#报错,貌似在 with ... cursor 下使用 for 循环有问题
                field_value = row[index]  # 该行某字段下的某索引下的字段值
                # if field_value is not None and field_value != '':# 剔除字段值为 None 或空字符串
                if field_value == '' or field_value is None:  # 短路剔除,效果更好
                    pass
                else:
                    if isinstance(field_value, (int, float)):
                        field_value = str(field_value)
                    val_union = field_value + val_union
                distinct.add(val_union)
                index = index - 1  # 索引逐降
    print("返回唯一值 {} 条".format(len(distinct)))
    for val in distinct:  # 直接打印结果,如需进一步操作,可使用 return 的返回值
        print(val)
    return distinct


if __name__ == '__main__':
    shp = r"E:\测试.gdb\test"
    distinct_value(shp, ("mc", "objectid"))

需要注意的是:

  1. 如果某字段为空,空字符串,数字时的处理.
  2. 如果取得某一个字段的唯一值, *field 参数即为一个,此时不用加括号,如果是要取得字段联合后的唯一值,这几个字段要()起来,组成元组.
  3. 由于有些场景需要打印出唯一值,所以我封装在函数内部了,可根据实际情况注释掉.如果要在 arcgis 中的 python 中使用,只使用函数体就行了.

你可能感兴趣的:(Python,for,arcgis)