Los datos escritos por una persona suelen incluir espacios y diferencias de mayúsculas. Un programa útil debe decidir cuáles son irrelevantes y cuáles cambian el significado. En esta lección transformarás entradas de texto sin borrar información importante. El resultado será una primera versión de la validación que después formará parte del inventario.
Separar el texto recibido del valor aceptado
Si alguien introduce « Cuaderno » normalmente quiere escribir «Cuaderno». El método strip elimina espacios al principio y al final. No suprime los espacios interiores. Ese comportamiento es adecuado para nombres como «Cuaderno cuadriculado». Una limpieza indiscriminada que quite todos los espacios produciría un nombre peor y haría más difícil reconocer el artículo.
Los métodos de las cadenas devuelven nuevos textos. No modifican la cadena original. Escribir nombre.strip() sin guardar el resultado no cambia la variable nombre. Puedes asignar el nuevo valor a otra variable para conservar la entrada o reemplazar la variable cuando ya no necesites el original. Esa decisión resulta útil al explicar qué ha corregido el programa.
entrada = " Cuaderno cuadriculado "
nombre = entrada.strip()
print(nombre)
print(entrada == nombre)
La comparación da False porque entrada conserva los espacios. Para buscar sin distinguir mayúsculas utilizaremos casefold. Es una transformación pensada para comparaciones de texto y no únicamente para letras inglesas. No equivale a eliminar tildes: «lapiz» y «lápiz» siguen siendo diferentes. El buscador final conservará esa regla y la explicará al usuario.
Elegir reglas distintas para códigos y nombres
Un código es una clave de identificación. En nuestro proyecto admitiremos entre uno y doce caracteres formados por letras ASCII mayúsculas, dígitos o guion. Los nombres aceptarán texto Unicode normal y espacios interiores. No conviene aplicar la misma restricción a ambos campos: que un código tenga un alfabeto reducido no justifica rechazar nombres con ñ.
Primero quitaremos los espacios exteriores del código y lo pasaremos a mayúsculas. Después comprobaremos longitud y caracteres. Con ese orden « cu001 » se convierte en CU001. Un espacio interior seguirá siendo incorrecto. La regla también impedirá utilizar comas o saltos de línea dentro de la clave. Más adelante centralizaremos esta decisión en una función compartida.
def limpiar_codigo(texto):
codigo = texto.strip().upper()
permitidos = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-"
if not 1 <= len(codigo) <= 12:
raise ValueError("El código debe tener de 1 a 12 caracteres")
if any(letra not in permitidos for letra in codigo):
raise ValueError("El código contiene caracteres no admitidos")
print(limpiar_codigo(" cu001 ")) «`
La expresión any responde si existe al menos un carácter incorrecto. Si todavía no la has usado puedes leerla como una pregunta: «¿alguna letra está fuera del conjunto permitido?». Cuando la respuesta es afirmativa se comunica un error mediante ValueError. No devolveremos una cadena vacía para representar el fallo porque podría confundirse con un dato válido.
Mostrar una información sin alterar la identidad
La búsqueda y la presentación no tienen por qué usar exactamente el mismo texto. Guarda «Lápiz azul» como nombre y compara versiones transformadas al buscar. Así la persona verá su escritura original aunque haya tecleado la consulta en mayúsculas. Si guardases todos los nombres en minúsculas estarías tomando una decisión de presentación innecesaria.
El operador in comprueba si una cadena aparece dentro de otra. La expresión consulta.casefold() in nombre.casefold() permite coincidencias parciales. Una consulta vacía aparece dentro de cualquier cadena. Debes decidir si eso significa «mostrar todo» o si prefieres rechazarla. En la aplicación final significará mostrar todos los artículos, lo que simplifica el comando de consulta.
La limpieza tiene límites
No intentes adivinar lo que una persona quiso escribir. Cambiar automáticamente LAO01 por LA001 puede unir dos artículos distintos. La letra O y el número cero son caracteres diferentes. Las transformaciones automáticas deben ser previsibles y fáciles de explicar. Para el código solo quitaremos espacios exteriores y normalizaremos mayúsculas.
También distinguiremos una cadena demasiado larga de una cadena vacía. El nombre final tendrá entre uno y ochenta caracteres después de strip. Rechazaremos saltos de línea porque cada nombre debe ocupar una sola línea al exportar. Esa regla no pretende resolver todos los casos de texto del mundo: define un formato sencillo para este proyecto educativo.
Errores habituales
Usar lower o casefold sobre todo el registro puede modificar campos que no son texto. Convertir cualquier objeto con str para ocultar un error también puede aceptar valores inesperados. Cuando construyas funciones reutilizables conviene declarar qué tipo de entrada esperan y comprobar los casos que podrían llegar desde archivos o desde otras funciones.
Otro fallo frecuente es mezclar limpieza con búsqueda de duplicados. limpiar_codigo transforma y valida una cadena pero no conoce los artículos existentes. La comprobación de unicidad corresponderá al almacenamiento. Mantener esas responsabilidades separadas permite usar la misma limpieza antes de un alta manual y antes de una importación CSV.
Una comprobación adicional
Una comprobación adicional consiste en ejecutar la limpieza dos veces sobre el mismo código. El resultado debería permanecer igual. Esa propiedad facilita encadenar capas sin alterar progresivamente la identidad. Pruébala con espacios exteriores y minúsculas antes de utilizar la función en archivos.
Lo que deberías recordar
- strip conserva los espacios interiores.
- casefold ayuda a comparar sin distinguir mayúsculas.
- La limpieza no comprueba duplicados.
- Las reglas deben ser distintas para códigos y nombres.
Ejercicio práctico
Guarda limpiar_codigo en practica_textos.py. Ejecuta la función con « cu001 », «LA-02», una cadena vacía, «CU 001» y un código de trece caracteres. Anota qué entradas se aceptan y cuáles deben producir ValueError. Para continuar con las pruebas puedes ejecutar cada caso por separado hasta estudiar las excepciones con más detalle.
Crea una lista de tres nombres con tildes y espacios interiores. Busca «CUAD» mediante casefold y el operador in. Repite con una consulta vacía. Escribe por qué ese segundo resultado es coherente con la definición de búsqueda que hemos elegido.
Diseña dos ejemplos de correcciones que no debería realizar el programa automáticamente. Uno debe distinguir cero de la letra O. El otro debe conservar una diferencia que consideres significativa en el nombre de un artículo. La práctica estará terminada cuando puedas explicar qué transformaciones admite tu función sin responder simplemente que limpia el texto.
Siguiente: Filtrar, ordenar y agrupar colecciones.








