Python para convertir archivos CSV de bancos

Cómo convertir CSV bancarios con Python para n8n (Guía 2026)

¿Te has encontrado alguna vez luchando con un archivo CSV de tu banco que parece diseñado para ser ilegible? No estás solo. En 2026, a pesar de los avances en Open Banking, muchas entidades financieras siguen entregando extractos con formatos inconsistentes, cabeceras redundantes y codificaciones de caracteres obsoletas que rompen cualquier flujo de automatización.

Si intentas importar estos datos directamente a n8n, lo más probable es que el nodo Spreadsheet File falle o genere objetos JSON mal formados. La solución no es limpiar los datos a mano cada mes, sino crear una capa de pre-procesamiento robusta utilizando Python.

En esta guía, te enseñaré cómo hemos implementado en nuestro laboratorio un script de Python optimizado para normalizar cualquier extracto bancario. Aprenderás a limpiar datos, estandarizar fechas y preparar un payload perfecto para que tus workflows de n8n funcionen como un reloj suizo.

Preparación del entorno Python y Librerías

Para este proceso, no necesitamos una infraestructura compleja. En pleno 2026, la eficiencia energética y la velocidad de ejecución son clave, por lo que utilizaremos el stack más ligero posible.

Requisitos Técnicos

  1. Python 3.12+: Las mejoras en el manejo de tipos y rendimiento son vitales.
  2. Pandas 2.5: La librería estándar de facto para manipulación de datos.
  3. Unidecode: Para eliminar tildes y caracteres especiales que suelen romper los sistemas de n8n.

Instala las dependencias necesarias con este comando en tu terminal:

pip install pandas unidecode openpyxl
💡 Consejo Pro: Si ejecutas n8n en Docker, asegúrate de crear una imagen personalizada que incluya Python y estas librerías, o usa un volumen compartido para que el contenedor tenga acceso al intérprete del host.

Análisis del CSV: El problema de los formatos bancarios

Los bancos suelen cometer tres errores capitales en sus exportaciones CSV que confunden a los parsers automáticos:

  • Metadatos iniciales: Filas con información de la cuenta antes de la cabecera real.
  • Separadores mixtos: Uso de punto y coma (;) en regiones europeas y coma (,) en internacionales.
  • Codificación: Archivos en ISO-8859-1 en lugar del estándar UTF-8.

Comparativa de Formatos Bancarios Comunes

Entidad (Tipo)EncodingSeparadorFilas de Basura
Banca TradicionalISO-8859-1; (Punto y coma)5-8 filas
Neobancos (Revolut/N26)UTF-8, (Coma)0 filas
Pasarelas (Stripe/PayPal)UTF-8, (Coma)0 filas
⚠️ Importante: Nunca asumas que el CSV es UTF-8. Si lo fuerzas, los caracteres como el símbolo del Euro (€) o las eñes se transformarán en símbolos extraños que ensuciarán tu base de datos.

Script de Normalización: De Sucio a JSON-Ready

A continuación, te presento el script que utilizamos en AndroFan para procesar estos archivos. Este código detecta automáticamente dónde empieza la tabla y limpia los nombres de las columnas.

import pandas as pd
import json
import sys
from unidecode import unidecode

def clean_csv(input_path):
    # 1. Detectar encoding y saltar filas de basura (skiprows)
    df = pd.read_csv(input_path, sep=None, engine='python', encoding='latin1', skiprows=5)
    
    # 2. Normalizar nombres de columnas
    df.columns = [unidecode(col.lower().replace(' ', '_')) for col in df.columns]
    
    # 3. Limpiar valores monetarios (quitar símbolos y convertir a float)
    if 'importe' in df.columns:
        df['importe'] = df['importe'].replace('[^0-9,-]', '', regex=True).str.replace(',', '.').astype(float)
    
    # 4. Convertir a formato JSON orientado a registros para n8n
    result = df.to_dict(orient='records')
    return json.dumps(result)

if __name__ == "__main__":
    print(clean_csv(sys.argv[1]))

¿Por qué este enfoque es superior?

  1. sep=None: Permite que Pandas detecte automáticamente si el banco usa comas o tabuladores.
  2. unidecode: Convierte «Categoría» en «categoria», evitando problemas de acceso a propiedades en JavaScript dentro de n8n.
  3. Orientación a records: Genera una lista de objetos, que es exactamente lo que n8n espera recibir en sus nodos de entrada.

Integración en n8n mediante el Nodo Execute Command

Una vez que el script funciona localmente, debemos llevarlo al flujo de trabajo automatizado. En n8n, tienes dos opciones principales para ejecutar este código en 2026.

Opción A: Nodo Execute Command (Recomendado por rendimiento)

Si tienes Python instalado en el mismo servidor que n8n, este es el método más rápido. Solo necesitas pasar la ruta del archivo descargado como argumento.

  • Configura un nodo Read Binary File para obtener el CSV.
  • Usa un nodo Write Binary File para guardarlo temporalmente en /tmp/banco.csv.
  • Añade el nodo Execute Command con el comando: python3 /scripts/cleaner.py /tmp/banco.csv.

Opción B: Nodo Python (Sandboxed)

Desde las versiones recientes de n8n en 2025, existe un nodo nativo de Python. Sin embargo, tiene limitaciones de memoria y no siempre permite importar Pandas si no está configurada la variable de entorno NODE_FUNCTION_ALLOW_EXTERNAL.

Ventajas y Desventajas

✅ Ventajas

  • Elimina el error humano en la limpieza de datos financieros.
  • Escalabilidad total: procesa 1 o 10.000 filas en milisegundos.
  • Compatibilidad con cualquier banco mediante ajustes mínimos de skiprows.

❌ Desventajas

  • Requiere mantenimiento del script si el banco cambia su formato de exportación.
  • Necesita conocimientos básicos de gestión de archivos en servidores Linux.

Preguntas Frecuentes

¿Es seguro procesar datos bancarios con Python?

Absolutamente, siempre que el script se ejecute localmente en tu infraestructura y no envíes los datos a APIs de terceros. El procesamiento ocurre en tu memoria RAM.

¿Por qué no usar el nodo ‘Spreadsheet File’ de n8n directamente?

El nodo nativo es excelente para archivos limpios, pero falla estrepitosamente con CSVs que tienen cabeceras múltiples o caracteres especiales mal codificados.

¿Puedo usar este método para archivos de Excel (.xlsx)?

Sí, solo necesitas cambiar pd.read_csv por pd.read_excel y asegurarte de tener instalada la librería openpyxl.

Conclusión

  • La normalización previa con Pandas evita el 99% de los errores de parsing en n8n.
  • Estandarizar nombres de columnas y formatos de fecha es vital para la integridad de los datos a largo plazo.
  • Ejecutar el script mediante Execute Command ofrece el mejor rendimiento en entornos Docker.

¿Has tenido problemas con algún banco específico al intentar automatizar tus finanzas? Cuéntanos tu experiencia en los comentarios y buscaremos la configuración de skiprows ideal para ti.

Comentarios

Aún no hay comentarios. ¿Por qué no comienzas el debate?

    Deja una respuesta

    Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *