Back to code 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.

This post is not in your language yet; you are seeing it in Spanish. The code is the same.

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.

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}")

Why it is written this way

  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.
How to try it

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

Watch out

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.

The 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.

Example written and reviewed by hand.

Share

Comments

No comments yet. Yours can be the first.

Plain text only, no links. No email is requested. Comments are reviewed before they are published.

Did you adapt it to something of yours?

Tell me what you solved with it, or what it was missing.

Keep trying

More code

See all
Darinel Ortega Online · I reply during the day
Today
Hello. I'm not selling anything here: this is for exchanging knowledge about technology.
Write whatever you like — you can send text, images or documents. Messages reach my console and I reply from there.

An open conversation to share knowledge. Messages reach my console and I reply from there.

Let us book a conversation

Pick the day and time that work for you. Thirty minutes, no sales pitch.

Video call

For a video call, just ask for one here and I'll send you the session link.