2 votos

Encontrar si el campo tiene registros vacíos usando ArcPy

Estoy intentando iterar todos los campos de un archivo de clase/forma de característica para comprobar si hay valores vacíos. Si hay registros vacíos en algún campo, me gustaría imprimir ese campo.

Conozco un poco de Python y aquí está mi intento.

import arcpy
from arcpy import env

env.workspace = r"C:\SOFTWARE\Python\Jun2019"
fc ="test.shp"
##
fieldlist = arcpy.ListFields(fc)
##Iterate feilds
for field in fieldlist:
           # Iterate over each feature; if it has a non-null value
           with arcpy.da.SearchCursor(fc, field) as cursor:
               for row in cursor:
                   if row[0]h=

Estoy atrapado aquí.

¿Cómo continúo?

enter image description here

Quiero imprimir los campos TYPE,CAT,SUBTYPE etc. que tienen valores vacíos

1voto

Aaron Puntos 25882

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, "", " "])]

0voto

x3ja Puntos 169

Podría identificar todas las filas en las que alguno de esos campos esté vacío incluyendo una cláusula where en su cursor:

with arcpy.da.SearchCursor(fc, field,'"TYPE" IS NULL or "SUBTYPE" IS NULL or "CAT" IS NULL') as cursor:
    for row in cursor: #only includes rows where at least one of the three are empty

La consulta SQL variará en función del tipo de conjunto de datos y de los tipos de campo (el ejemplo anterior busca valores nulos en una clase de característica FGDB).

Entonces sólo analizará la tabla una vez.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X