Volver al código Python

Limpiar un CSV de clientes y decir qué filas están mal

Lee un CSV, normaliza nombre y correo, separa las filas buenas de las malas y dice en qué línea está cada problema.

El problema

Te pasan una planilla de clientes exportada a mano. Antes de cargarla a cualquier sistema hay que saber cuántas filas sirven y cuáles no, con el número de línea para poder corregirlas.

Python
import csv, re, sys

EMAIL = re.compile(r"^[^@\s]+@[^@\s]+\.[^@\s]+$")

def limpiar(ruta):
    buenas, malas = [], []
    with open(ruta, newline="", encoding="utf-8") as f:
        for n, fila in enumerate(csv.DictReader(f), start=2):
            nombre = (fila.get("nombre") or "").strip()
            correo = (fila.get("correo") or "").strip().lower()
            if not nombre:
                malas.append((n, "falta el nombre"))
            elif not EMAIL.match(correo):
                malas.append((n, f"correo inválido: {correo!r}"))
            else:
                buenas.append({"nombre": nombre.title(), "correo": correo})
    return buenas, malas

if __name__ == "__main__":
    buenas, malas = limpiar(sys.argv[1])
    print(f"{len(buenas)} filas buenas, {len(malas)} con problemas")
    for n, motivo in malas:
        print(f"  línea {n}: {motivo}")

Por qué está escrito así

  1. csv.DictReader lee cada fila como diccionario usando la primera línea como encabezado; por eso la numeración arranca en 2.
  2. newline="" es lo que pide el módulo csv para no romperse con saltos de línea dentro de una celda.
  3. Las filas malas no se descartan en silencio: se guardan con su línea y su motivo. Ese es todo el valor del script.
  4. La expresión del correo es deliberadamente simple: detecta lo que claramente no es un correo, no pretende validar el estándar entero.
Cómo probarlo

Guardalo como limpiar.py, armá un clientes.csv con las columnas nombre y correo, y corré: python3 limpiar.py clientes.csv

Ojo con esto

Si la planilla viene de Excel en Windows puede estar en latin-1 o traer BOM: probá encoding="utf-8-sig". Y si las columnas se llaman distinto, el script no avisa: marca todo como "falta el nombre".

Adaptalo a tu caso con IA

El botón copia este prompt con el código pegado debajo. Reemplazá los corchetes con lo tuyo y pegalo en ChatGPT, Claude, Gemini o Copilot.

El prompt
Tengo este script de Python que limpia un CSV de clientes. Adaptalo a mi archivo, que tiene estas columnas: [COLUMNAS]. Las reglas de validación que necesito son: [REGLAS]. Además quiero que escriba las filas buenas en un CSV nuevo y las malas en otro con una columna de motivo. Mantené el número de línea en el reporte y no agregues dependencias externas.

Ejemplo escrito y revisado a mano.

Compartir

Comentarios

Todavía no hay comentarios. El primero puede ser el tuyo.

Solo texto, sin enlaces. No se pide correo. Los comentarios se revisan antes de publicarse.

¿Lo adaptaste a algo tuyo?

Contame qué resolviste con esto, o qué le faltó.

Seguí probando

Más código

Ver todos
Darinel Ortega En línea · respondo durante el día
Hoy
Hola. Acá no vendo nada: esto es para intercambiar conocimiento sobre tecnología.
Escribime lo que quieras — podés mandar texto, imágenes o documentos. Los mensajes llegan a mi consola y te respondo desde ahí.
Estás escribiendo fuera de horario. Te leo apenas empiece el día.

Conversación abierta para compartir conocimiento. Los mensajes llegan a mi consola y respondo desde ahí.

Agendemos una conversación

Elegí el día y la hora que te sirvan. Son treinta minutos, sin agenda comercial.

Videollamada

Para una videollamada, pedila por acá y te paso el enlace de la sesión.