5 votos

¿Convertir el caso de todos los valores en todos los campos de la tabla utilizando ArcPy y Python?

¿Alguien sabe cómo utilizar la función .upper() en un script autónomo de python para que se pueda utilizar para cambiar todos los caracteres de una tabla a mayúsculas? No quiero usar la calculadora de campos ya que tengo múltiples tablas, etc.

Actualmente estoy usando un cursor para corregir errores en mis tablas, pero no puedo averiguar la sintaxis correcta para usarlo para convertir todas las cadenas a mayúsculas.


La pregunta anterior se aplicaría igualmente cuando el cambio de caso que se desea es a la baja o al título.

1 votos

2 votos

Creo que el usuario está preguntando cómo convertir todos los campos de una tabla a mayúsculas en un solo movimiento. ¿No?

0 votos

Es correcto. Entonces, algo similar al código VB en la calculadora de campos - UCase(fieldname)...pero quiero hacerlo a toda la tabla usando un cursor de actualización...no puedo averiguar qué poner antes del .upper()...he enumerado mis campos, y ahora quiero escribir algo como - si row[0] es (algo), entonces mayúsculas.

9voto

Aaron Puntos 25882

El siguiente ejemplo muestra cómo integrar el método incorporado de python .upper() con el cursor de actualización de arcpy. Este ejemplo primero comprueba si un campo es de tipo String y luego revisa cada fila dentro de esa cadena para ver si hay valores en minúsculas. Si hay valores en minúsculas, la fila se actualiza con todas las mayúsculas.

import arcpy

fc = r'C:\temp\test.gdb\yourFC'

desc = arcpy.Describe(fc)
fields = desc.fields

for field in fields:
    if field.Type == "String":
        with arcpy.da.UpdateCursor(fc, str(field.name)) as cursor:
            for row in cursor:
                if row[0] == None:  # Check for "<Null>"
                    continue
                else:
                    any(x.islower() for x in row[0]) == True
                    row[0] = row[0].upper()
                    cursor.updateRow(row)

0 votos

Aaron, ¡gracias! ¡Esto es exactamente lo que estaba buscando! Lo único que me he dado cuenta es que los valores NULL no son iterables, así que he ejecutado un rápido script para conseguir que estos queden en blanco. Por curiosidad, ¿sabes cómo saltar esos valores NULL en este script?

0 votos

No hay problema, he actualizado el script con la lógica para comprobar si hay <Null>.

2 votos

Realmente impresionante. He aprendido mucho en este pequeño script. ¡Muchas gracias!

1voto

kyle k Puntos 116

Así es como se puede utilizar .upper() en python:

data = "lower case data"
upper_case_data = data.upper()
print upper_case_data

también se puede utilizar directamente con una cadena

print "lower case data".upper()

0 votos

Gracias, Kyle. ¿Sabes cómo podría usar esto con un cursor de búsqueda? Estoy recorriendo cada campo de mi tabla y si hay algún carácter en minúscula, quiero que cambie a mayúscula.

0 votos

@Dane ¿Qué sistema de base de datos utilizas?

0 votos

Estoy usando Arcmap 10.1 y escribiendo mi código en PythonWin.

1voto

neouser99 Puntos 1203

He aquí un ejemplo rápido:

fc = "whatever"
fields = ("Name", "Addy", "Stuff")
with arcpy.da.UpdateCursor(fc, fields) as cursor:
    for row in cursor:
        row[0] = row[0].upper()
        row[1] = row[1].upper()
        row[2] = row[2].upper()
        cursor.updateRow(row)

Y aquí está el manual de ArcGIS para el da.ActualizarCursor

0 votos

Gracias por la ayuda. Me he dado cuenta de que el problema que tengo es que el cursor golpea cada campo. No quiero tener que listar todos los nombres de los campos...El manual del da.UpdateCursor dice que hay que usar (*) si quieres que se usen todos los nombres de los campos, pero nunca consigo que eso funcione...ver que refuerzas el row[0] = row[0].upper() ha ayudado definitivamente...¡Lo votaría, pero no tengo suficiente crédito en la calle!

0voto

dchanson Puntos 29

Similar, pero diferente a lo anterior:

import arcpy
fc = "YOUR FC"
fields = [f.name for f in arcpy.ListFields(fc) if f.Type == "String"]

cur = arcpy.UpdateCursor(fc)
for row in cur:
    for field in fields:
        try:
            row.setValue(field) = row.getValue(field).upper()
        except:
            pass
    row.updateCursor(row)

0 votos

Gracias, Darryl. ¿Alguna razón en particular por la que no hayas usado arcpy.da.UpdateCursor? Estoy en casa y no tengo mis datos, pero asumo que el "pase" evitaría el error de NULL iterable... bonito.

1 votos

Oh, sí, todavía estoy corriendo 10.0 - por lo que no tienen el arcpy.da.UpdateCursor disponible todavía. Sé que esto es más rápido - así que ese cambio mejorará su eficiencia. Además, me imagino que recorrer el cursor 1 vez será más rápido que recorrerlo 1 vez por cada campo como muestra la respuesta aceptada. Espero que te funcione.

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