Aquí hay dos enfoques. Sospecho que el primer enfoque es más rápido ya que sale del bucle tan pronto como encuentra un valor en una lista de búsqueda:
Método 1: Cursor de búsqueda clásico
import arcpy
fc = r'C:\path\to\your\geodatabase.gdb\featureclass'
# Get a list of fields
fields = [x.name for x in arcpy.ListFields(fc)]
bad_list = []
for field in fields:
with arcpy.da.SearchCursor(shp, field) as cursor:
for row in cursor:
if row[0] in ["", None, " "]:
bad_list.append(field)
break
print bad_list
Enfoque 2: Diccionario de consulta
Este es otro enfoque que consulta un diccionario poblada por un Cursor de búsqueda .
Utilice un comprensión de la lista para obtener una lista de todos los campos de la featureclass
fields = [x.name for x in arcpy.ListFields(fc)]
Utilice un Cursor de Búsqueda para rellenar un diccionario con valores únicos ( set()
).
d = {field: set(x[0] for x in arcpy.da.SearchCursor(fc, field)) for field in fields}
El diccionario resultante tiene la siguiente estructura:
{'Field1': ['A','B','C'], 'Field2': ['A', None, 'B'], 'Field3': [1, 2, 3]}
Ahora consulte el diccionario con la siguiente lista de búsqueda [None, "", " "]
y rellenar una lista con los campos que contienen elementos de la lista de búsqueda:
bad_list = [a for a, b in d.items() if any(w in b for w in [None, "", " "])]
Ponerlo todo junto:
import arcpy
fc = r'C:\path\to\your\geodatabase.gdb\featureclass'
# Get a list of fields
fields = [x.name for x in arcpy.ListFields(fc)]
# Populate a dictionary where key = field and value = list of unique values
d = {field: set(x[0] for x in arcpy.da.SearchCursor(fc, field)) for field in fields}
# Query dictionary and return list of fields that contain an item in the search list
bad_list = [a for a, b in d.items() if any(w in b for w in [None, "", " "])]