Automatizar

Leer y escribir archivos CSV con Python

Cómo procesar archivos CSV desde Python con el módulo csv: leer filas, trabajar con columnas por nombre, y escribir datos. Con los detalles de codificación que rompen los scripts.

El CSV es el formato más común para intercambiar datos tabulares: exportaciones de Excel, reportes, listados. Python trae el módulo csv incluido (no se instala nada) para leerlos y escribirlos de forma fiable. Aquí lo esencial, con los detalles de codificación que hacen fallar a tantos scripts.

Leer un CSV fila por fila

import csv

with open("datos.csv", newline="", encoding="utf-8") as archivo:
    lector = csv.reader(archivo)
    for fila in lector:
        print(fila)   # cada fila es una lista: ['Ana', '30', 'Caracas']

Dos detalles que parecen menores pero importan. El newline="" evita que aparezcan filas en blanco entre cada fila en algunos sistemas (sobre todo Windows) — ponlo siempre al abrir un CSV. Y el encoding="utf-8" es clave: sin él, un CSV con acentos o ñ puede dar un error de codificación o mostrar caracteres raros. Es el tropiezo número uno con datos en español.

Leer por nombre de columna (más robusto)

Acceder a las columnas por posición (fila[0], fila[1]) es frágil: si cambia el orden de las columnas, tu código se rompe en silencio. Mejor usar DictReader, que lee cada fila como un diccionario con los nombres de columna:

import csv

with open("datos.csv", newline="", encoding="utf-8") as archivo:
    lector = csv.DictReader(archivo)
    for fila in lector:
        print(fila["nombre"], fila["ciudad"])

DictReader usa la primera fila del CSV como encabezados, y accedes a cada dato por su nombre (fila["nombre"]) en vez de por número. Más legible y más resistente a cambios. Es la forma recomendada para casi todo.

Escribir un CSV

import csv

datos = [
    ["nombre", "edad", "ciudad"],
    ["Ana", 30, "Caracas"],
    ["Luis", 25, "Valencia"],
]

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

El "w" abre el archivo en modo escritura. writerows escribe toda la lista de filas de golpe; si quieres una sola, writerow (sin la “s”). Mismo cuidado con newline="" y encoding="utf-8" al escribir.

Escribir por nombre de columna

El equivalente a DictReader para escribir es DictWriter, útil cuando trabajas con diccionarios:

import csv

datos = [
    {"nombre": "Ana", "ciudad": "Caracas"},
    {"nombre": "Luis", "ciudad": "Valencia"},
]

with open("salida.csv", "w", newline="", encoding="utf-8") as archivo:
    campos = ["nombre", "ciudad"]
    escritor = csv.DictWriter(archivo, fieldnames=campos)
    escritor.writeheader()        # escribe la fila de encabezados
    escritor.writerows(datos)

El fieldnames define las columnas y su orden, y writeheader() escribe esa primera fila de títulos. Ideal cuando tus datos ya son diccionarios.

Un ejemplo real: filtrar y guardar

Juntando todo, leer un CSV, quedarte solo con ciertas filas, y guardar el resultado:

import csv

with open("clientes.csv", newline="", encoding="utf-8") as entrada:
    lector = csv.DictReader(entrada)
    activos = [fila for fila in lector if fila["estado"] == "activo"]

with open("clientes_activos.csv", "w", newline="", encoding="utf-8") as salida:
    escritor = csv.DictWriter(salida, fieldnames=lector.fieldnames)
    escritor.writeheader()
    escritor.writerows(activos)

print(f"Guardados {len(activos)} clientes activos.")

Lees, filtras con una comprensión de lista, y escribes solo lo que cumple. Ese patrón —leer, transformar, escribir— es el corazón de casi toda automatización con datos.

Cuándo usar csv y cuándo no

El módulo csv es perfecto para archivos de tamaño razonable y tareas directas. Si vas a hacer análisis pesado, cálculos sobre columnas o manejar archivos enormes, ahí conviene la librería pandas, que es otro nivel. Pero para leer, filtrar y escribir CSV sin dependencias, el módulo csv incluido en Python hace el trabajo sin instalar nada.

Resumen

  • Abre siempre con newline="" y encoding="utf-8" — evita filas en blanco y problemas con acentos.
  • csv.reader lee filas como listas; csv.DictReader como diccionarios por nombre de columna (más robusto).
  • csv.writer / DictWriter para escribir; writeheader() pone los títulos.
  • El patrón leer → filtrar → escribir cubre la mayoría de automatizaciones con datos.

Con esto procesas cualquier CSV sin depender de Excel ni de webs externas. Combínalo con el Programador de tareas de Windows para que el procesamiento corra solo cada día.


¿Tu CSV usa punto y coma en vez de coma (común en Excel en español), o necesitas análisis más pesado con pandas? Escríbeme desde contacto y lo vemos.

← Más de Automatizar