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 conencoding='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 usaos.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ámetroindex=Falseento_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