2 votos

Problemas con las expresiones de Python de la calculadora de campo

Soy bastante nuevo en Python y este es mi primer mensaje en este foro, así que me vendría bien algo de ayuda. Actualmente estoy tratando de ejecutar un código en la calculadora de campo en un modelo con el fin de reemplazar los caracteres de cadena (guión, punto, espacio) con un guión bajo ('_'). Esto es lo que tengo ahora.

def customReplace(Layer):
repList = ['-', ' ', '.'];
rep = '_'
for repList in Layer:
    return Layer.replace(repList, rep)
else:
    return Layer

Estoy recibiendo un error de sintaxis: ERROR 000539: SyntaxError: unexpected EOF while parsing (, line 1) No se ha podido ejecutar (Calcular campo (2)).

¿Alguien por ahí me echa una mano?

Por cierto, he definido la función anterior en el área de código del script pre-lógico y la estoy llamando a través de

customReplace( !Layer! )

2voto

xenny Puntos 670

No estoy completamente seguro de entender el objetivo de su guión, pero aquí hay algunos comentarios

def customReplace(fieldV): # you must indent after your def
    repList = ['-', ' ', '.'] #remove the ;
    rep = '_'
    b=fieldV
    for old in repList: #I guess you want to replace the values in replist
        b = b.replace(old, rep) #here you need return, not print
    return b #no need to use else, but you must unindent

tenga en cuenta que debe poner la función en un bloque de código y llamarla con el nombre del campo

customReplace(!Layer!)

1voto

Stephen Puntos 1

Supongo que te refieres al valor del campo que hay que cambiar y no al nombre de la capa, ya que has mencionado la calculadora de campos

Aunque la misma lógica podría aplicarse en un script para los nombres de las capas reales

Ok te entiendo y lo tengo claro.

(1) Asegúrate de que tu parser está marcado para python.

(2) En el código de guión pre-lógico:

def customReplace(fieldValue):
  repList = ["DRG", "2014"] #my examples, change to yours
  repValue = "_"
  for item in repList:
    if item in fieldValue:
      fieldValue = fieldValue.replace(item, repValue)
  return fieldValue

(3) En el segundo cuadro, asegúrate de llamar a esta función y pasar el campo que estás editando.

Vea mi foto para más información. Screenshot

0voto

Andrew Shepherd Puntos 339

No estoy seguro de lo que intentas hacer exactamente. ¿Se supone que Layer es una clase de característica o shapefile, o un campo?

Uno, todas las líneas de la función deben tener sangría. Dos, no puedes tener un punto y coma al final de una línea. Tres, Layer es probablemente una palabra reservada, no la uses. Cuatro, repList no está en Layer; ese bucle dará error o resultados inesperados. Cinco, aunque no es exactamente un error, ¿tiene sentido devolver Layer en la cláusula else?

No creo que lo que quieres sea tan difícil, pero ¿qué intentas hacer exactamente?

0voto

Stephen Puntos 1

Quería ofrecer otra alternativa a mi respuesta anterior

Yo soy más partidario de usar la ventana interactiva de python y un UpdateCursor para la mayoría de mis cambios en la tabla de atributos. Cuando escribí mi respuesta anterior, la escribí en la ventana interactiva y la traduje a la calculadora de campos. Mi código interactivo era:

replaceList = ["DRG", "2014"]
replaceValue = "_"

rows = arcpy.UpdateCursor(#LAYERNAME)
for row in rows:
  currentValue = row.getValue("UniqueID") #your field name as a parameter
  for item in replaceList:
    if item in currentValue:
      currentValue = currentValue.replace(item, replaceValue)
    row.setValue("UniqueID", currentValue)
  rows.updateRow(row)

Notas... Normalmente soy más partidario de utilizar sintaxis como currentValue = row.FIELDNAME en lugar de getValue y lo mismo ocurre con la configuración como row.FIELDNAME = currentValue . Utilizando setValue y getValue son buenos para entender el proceso, pero prefiero la sintaxis más corta.

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