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.
The problem
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}")
Why it is written this way
- 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".
Adapt it to your case with AI
The button copies this prompt with the code pasted below it. Replace the brackets with your own details and paste it into ChatGPT, Claude, Gemini or 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.
Example written and reviewed by hand.
Comments
No comments yet. Yours can be the first.
Did you adapt it to something of yours?
Tell me what you solved with it, or what it was missing.