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.
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í
- csv.DictReader lee cada fila como diccionario usando la primera línea como encabezado; por eso la numeración arranca en 2.
- newline="" es lo que pide el módulo csv para no romperse con saltos de línea dentro de una celda.
- Las filas malas no se descartan en silencio: se guardan con su línea y su motivo. Ese es todo el valor del script.
- La expresión del correo es deliberadamente simple: detecta lo que claramente no es un correo, no pretende validar el estándar entero.
Guardalo como limpiar.py, armá un clientes.csv con las columnas nombre y correo, y corré: python3 limpiar.py clientes.csv
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.
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.
Comentarios
Todavía no hay comentarios. El primero puede ser el tuyo.
¿Lo adaptaste a algo tuyo?
Contame qué resolviste con esto, o qué le faltó.