Lectura y Escritura de Archivos CSV y Excel

Lectura
40 min~6 min lectura

Lectura y Escritura de Archivos CSV y Excel con Python

En el mundo de la automatización de procesos, la capacidad de manipular archivos CSV y Excel es fundamental. Estos formatos son los más utilizados en entornos empresariales para almacenar y compartir datos. Python ofrece bibliotecas potentes como csv, pandas, openpyxl y xlrd que facilitan estas tareas de manera eficiente y confiable.

¿Por qué automatizar el manejo de archivos CSV y Excel?

Imagina que manualmente debes procesar 50 reportes de ventas mensuales. Cada archivo contiene 2000 filas de datos que necesitas consolidar, analizar y generar un reporte resumen. Este trabajo podría tomarte 3 días completos. Con Python, puedes automatizar este proceso para que se ejecute en minutos, con total consistencia y sin errores humanos.

Trabajando con Archivos CSV

El formato CSV (Comma-Separated Values) es un archivo de texto plano donde los datos están separados por comas. Es ligero, compatible con prácticamente todas las aplicaciones y fácil de procesar con Python.

Lectura de archivos CSV

Python incluye el módulo csv en su biblioteca estándar, por lo que no necesitas instalar nada adicional. Aquí tienes los métodos principales:

Usando el módulo csv básico

import csv

# Lectura básica de un archivo CSV
with open('ventas.csv', 'r', encoding='utf-8') as archivo:
    lector = csv.reader(archivo)
    
    # Saltar la fila de encabezados
    encabezados = next(lector)
    print(f"Columnas: {encabezados}")
    
    # Iterar sobre las filas de datos
    for fila in lector:
        print(fila)

# Lectura como diccionario (más legible)
with open('ventas.csv', 'r', encoding='utf-8') as archivo:
    lector = csv.DictReader(archivo)
    
    for fila in lector:
        print(f"Cliente: {fila['nombre']}, Total: {fila['total']}")

Usando pandas para CSV (método recomendado)

La biblioteca pandas es la navaja suiza para análisis de datos. Ofrece una sintaxis más limpia y operaciones más potentes:

import pandas as pd

# Lectura simple
df = pd.read_csv('ventas.csv')

# Lectura con configuración específica
df = pd.read_csv('ventas.csv', 
                  encoding='utf-8',
                  sep=',',
                  thousands='.',
                  decimal=',',
                  header=0)

# Ver las primeras 5 filas
print(df.head())

# Ver información del DataFrame
print(df.info())

# Estadísticas básicas
print(df.describe())

Escritura de archivos CSV

import csv

# Escritura básica con módulo csv
datos = [
    ['Nombre', 'Edad', 'Ciudad'],
    ['Ana García', 28, 'Madrid'],
    ['Carlos López', 35, 'Barcelona'],
    ['María Rodríguez', 42, 'Valencia']
]

with open('personas.csv', 'w', newline='', encoding='utf-8') as archivo:
    escritor = csv.writer(archivo)
    escritor.writerows(datos)

# Escritura con pandas (método recomendado)
import pandas as pd

data = {
    'Nombre': ['Ana García', 'Carlos López', 'María Rodríguez'],
    'Edad': [28, 35, 42],
    'Ciudad': ['Madrid', 'Barcelona', 'Valencia']
}

df = pd.DataFrame(data)
df.to_csv('personas.csv', index=False, encoding='utf-8')

Trabajando con Archivos Excel

Los archivos Excel (.xlsx, .xls) son más complejos que CSV porque pueden contener múltiples hojas, formatos, fórmulas y gráficos. Python maneja estos archivos principalmente con openpyxl y pandas.

# Instalación de dependencias necesarias
# pip install pandas openpyxl xlrd

import pandas as pd

# Lectura de archivo Excel
df = pd.read_excel('reporte_ventas.xlsx', sheet_name='Hoja1')

# Si el archivo tiene varias hojas
todas_las_hojas = pd.read_excel('reporte_ventas.xlsx', sheet_name=None)
for nombre_hoja, df in todas_las_hojas.items():
    print(f"Hoja: {nombre_hoja}, Filas: {len(df)}")

# Especificar hoja por número
df = pd.read_excel('reporte_ventas.xlsx', sheet_name=0)

Escritura de archivos Excel

import pandas as pd

# Crear múltiples DataFrames
ventas_enero = pd.DataFrame({
    'Producto': ['Laptop', 'Mouse', 'Teclado'],
    'Unidades': [15, 45, 30],
    'Precio': [899, 25, 45]
})

ventas_febrero = pd.DataFrame({
    'Producto': ['Laptop', 'Mouse', 'Teclado'],
    'Unidades': [20, 60, 35],
    'Precio': [899, 25, 45]
})

# Escribir en un mismo archivo, diferentes hojas
with pd.ExcelWriter('reporte_ventas_2024.xlsx', engine='openpyxl') as escritor:
    ventas_enero.to_excel(escritor, sheet_name='Enero', index=False)
    ventas_febrero.to_excel(escritor, sheet_name='Febrero', index=False)

print("Archivo Excel creado exitosamente con múltiples hojas")

Manipulación avanzada con openpyxl

Para tareas que requieren control total sobre el formato, usa openpyxl directamente:

from openpyxl import Workbook
from openpyxl.styles import Font, PatternFill, Alignment
from openpyxl.utils import get_column_letter

# Crear un libro nuevo
wb = Workbook()
ws = wb.active
ws.title = "Reporte Mensual"

# Agregar encabezados con formato
encabezados = ['Fecha', 'Producto', 'Cantidad', 'Total']
for col, header in enumerate(encabezados, 1):
    celda = ws.cell(row=1, column=col, value=header)
    celda.font = Font(bold=True, color="FFFFFF")
    celda.fill = PatternFill(start_color="366092", end_color="366092", fill_type="solid")
    celda.alignment = Alignment(horizontal='center')

# Agregar datos
datos = [
    ['2024-01-15', 'Laptop HP', 5, 4495.00],
    ['2024-01-16', 'Monitor Dell', 8, 2392.00],
    ['2024-01-17', 'Teclado Mecánico', 12, 540.00]
]

for fila_idx, fila_datos in enumerate(datos, 2):
    for col_idx, valor in enumerate(fila_datos, 1):
        ws.cell(row=fila_idx, column=col_idx, value=valor)

# Ajustar ancho de columnas
for col in range(1, 5):
    ws.column_dimensions[get_column_letter(col)].width = 15

wb.save('reporte_formateado.xlsx')

Ejemplo Práctico: Automatización Completa

Veamos un ejemplo integral que combina todo lo aprendido para automatizar un proceso real de consolidación de datos:

import pandas as pd
import os
from datetime import datetime

def consolidar_reportes(carpeta_fuente, archivo_destino):
    """
    Consolida todos los archivos CSV de una carpeta en un único Excel.
    """
    # Lista todos los archivos CSV en la carpeta
    archivos_csv = [f for f in os.listdir(carpeta_fuente) if f.endswith('.csv')]
    
    if not archivos_csv:
        print("No se encontraron archivos CSV en la carpeta")
        return
    
    todos_los_datos = []
    
    # Procesar cada archivo
    for archivo in archivos_csv:
        ruta_completa = os.path.join(carpeta_fuente, archivo)
        print(f"Procesando: {archivo}")
        
        # Leer el CSV
        df = pd.read_csv(ruta_completa)
        
        # Agregar columna con nombre del archivo origen
        df['archivo_origen'] = archivo
        
        # Agregar fecha de procesamiento
        df['fecha_procesamiento'] = datetime.now().strftime('%Y-%m-%d %H:%M')
        
        todos_los_datos.append(df)
    
    # Combinar todos los DataFrames
    df_consolidado = pd.concat(todos_los_datos, ignore_index=True)
    
    # Generar resumen estadístico
    resumen = df_consolidado.describe()
    
    # Guardar en Excel con múltiples hojas
    with pd.ExcelWriter(archivo_destino, engine='openpyxl') as escritor:
        df_consolidado.to_excel(escritor, sheet_name='Datos Consolidados', index=False)
        resumen.to_excel(escritor, sheet_name='Resumen Estadístico')
    
    print(f"\nProceso completado!")
    print(f"Total de registros: {len(df_consolidado)}")
    print(f"Archivo guardado: {archivo_destino}")

# Ejecutar la automatización
consolidar_reportes('./datos/ventas/', 'reporte_consolidado.xlsx')

Errores Comunes y Cómo Evitarlos

  • Error: UnicodeDecodeError al abrir archivos

    Este error ocurre cuando el archivo tiene una codificación diferente. Solución: especifica siempre el parámetro encoding='utf-8' o intenta con encoding='latin-1'. Muchos archivos Excel exportados desde sistemas antiguos usan codificaciones diferentes.

  • Error: FileNotFoundError

    La ruta del archivo es incorrecta o el archivo está siendo usado por otra aplicación. Solución: usa rutas absolutas con os.path.abspath(), verifica que el archivo esté cerrado antes de procesarlo y usa os.path.exists() para verificar la existencia antes de abrir.

  • Problema: datos mezclados o filas vacías en Excel

    Esto suele ocurrir al escribir con pandas sin especificar newline='' en archivos CSV o al abrir un archivo Excel que ya está abierto. Solución: cierra siempre los archivos de Excel antes de procesarlos y usa el parámetro index=False en to_excel() para evitar la columna de índices.

Checklist de Dominio

Antes de continuar, verifica que dominas estos conceptos:

  • ✓ Soy capaz de leer archivos CSV usando tanto el módulo csv como pandas
  • ✓ Puedo escribir archivos CSV con diferentes delimitadores y codificaciones
  • ✓ Sé leer archivos Excel con una o múltiples hojas usando pandas
  • ✓ Puedo crear archivos Excel con formato personalizado usando openpyxl
  • ✓ Entiendo cuándo usar cada biblioteca (csv vs pandas vs openpyxl)
  • ✓ Manejo correctamente las codificaciones de caracteres (UTF-8, Latin-1)
  • ✓ Sé manejar rutas de archivos de forma segura con os.path
  • ✓ Puedo consolidar múltiples archivos en un solo reporte automatizado
  • ✓ Conozco los errores comunes y sé cómo diagnosticarlos
  • ✓ Puedo crear funciones reutilizables para automatizar procesos repetitivos