6 votos

arcpy.da.SearchCursor ignora el parámetro where_clause?

Estoy tratando de usar arcpy.da.SearchCursor para revisar los registros de una clase de características almacenadas en una base de datos SQL SDE. Lo hago a través de una capa de características (creada en arcpy) llamada "unit_lyr". Cuando ejecuto el da.SearchCursor, la cláusula where es ignorada y arcpy devuelve todos los registros de la capa. Cuando lo ejecuto usando el antiguo arcpy.SearchCursor, todo funciona como se espera. ¿Alguna idea de por qué? Gracias por tu ayuda.

# Run it the old way, everything goes fine.
unit_list = []
rows = arcpy.SearchCursor('unit_lyr', 'UnitDate IS NOT NULL')
for row in rows:
    if row.UnitName is not None:
        if len(row.UnitName) > 1:
            unit_list.append(row.UnitName)

>>> len(unit_list)
192

# Use arcpy.da and all values are returned.
unit_list = []
with arcpy.da.SearchCursor('unit_lyr', 'UnitName', 'UnitDate IS NOT NULL') as rows:
    for row in rows:
        if row[0] is not None:
            if len(row[0]) > 1:
                unit_list.append(row[0])

>>> len(unit_list)
1085

0 votos

A mí también me ha pasado esto antes de forma aleatoria. Parece que podría haber algún tipo de error. lo que es aún más extraño es incluso su if row[0] is not None: tampoco filtró correctamente los resultados.

0 votos

¿Qué ocurre si se omite la capa y se ejecutan los cursores directamente sobre los datos?

1 votos

Creo que deberías mostrar el código exacto que estás ejecutando sin las >>> indicaciones para que podamos estar seguros de tu sangría etc y podamos copiar/pegar para probar.

7voto

rowntreerob Puntos 131

Si tu versión actual es la 10.1 (como sugiere una de tus etiquetas), existe un error para da searchcursor, consulta este error:

NIM076948 La cláusula where de arcpy.da.SearchCursor() no funciona con una vista de tabla.

Creo que también se aplica a las capas de características. Cuestiones abordadas en 10.2 nota este error, ver esto:

http://downloads.esri.com/support/downloads/other_/102-IssuesAddressedList.pdf

No estoy seguro de que funcione, pero podría intentar una consulta de selección (Seleccionar capa por atributos) en la fuente de origen y utilizarla en el cursor... o, alternativamente, escribir la capa de características en un espacio de trabajo temporal o desde cero y aplicar la cláusula where allí.

0 votos

Gracias. He buscado un informe de errores pero no he encontrado nada al respecto. Estoy usando 10.1, así que creo que este es mi problema. Ahora sólo tengo que volver a través de mi viejo código en otros proyectos y ver si esto ha estado causando problemas que ni siquiera he notado.

-1voto

Joseph Toronto Puntos 116

Creo que tu bucle for no se está ejecutando usando tu sentencia with. La imagen lo refleja por la ausencia de sangría en su bucle for. Espero que te ayude.

PythonIndent

2 votos

Eso es sólo para mostrar cómo se vería en un aviso. La sangría es legítima.

1 votos

Si la sangría fuera incorrecta, el OP estaría recibiendo un error de sintaxis.

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