CSV en Python: csv.reader, DictReader y cuándo pasar a pandas

El módulo csv de Python gestiona la lectura y escritura de archivos separados por comas (y por otros delimitadores). Es más fiable que dividir líneas con split(",") porque maneja correctamente las comillas, los saltos de línea dentro de campos y los delimitadores alternativos.

csv.reader: leer fila a fila

import csv

with open("usuarios.csv", encoding="utf-8", newline="") as f:
    lector = csv.reader(f)
    cabecera = next(lector)   # primera fila como cabecera
    print(cabecera)
    for fila in lector:
        print(fila)   # lista de cadenas

# newline="" es obligatorio en Windows para evitar r extra

csv.DictReader: fila como diccionario

Con DictReader cada fila es un diccionario con las claves de la cabecera. Mucho más legible cuando el CSV tiene muchas columnas:

import csv

with open("empleados.csv", encoding="utf-8", newline="") as f:
    lector = csv.DictReader(f)
    for fila in lector:
        print(f"{fila['nombre']}: {fila['departamento']} ({fila['salario']}€)")

Filtrar columnas de una exportación de Excel

import csv

COLUMNAS = ["id", "nombre", "email"]

def filtrar_columnas(entrada, salida, columnas):
    with open(entrada, encoding="utf-8-sig", newline="") as fin, 
         open(salida, "w", encoding="utf-8", newline="") as fout:

        lector  = csv.DictReader(fin)
        escritor = csv.DictWriter(fout, fieldnames=columnas,
                                  extrasaction="ignore")
        escritor.writeheader()
        for fila in lector:
            escritor.writerow(fila)

# filtrar_columnas("exportacion_excel.csv", "reducido.csv", COLUMNAS)

csv.writer: escribir CSV

import csv
from datetime import date

pedidos = [
    (1, "Teclado", 89.99, date(2026, 6, 1)),
    (2, "Ratón",   29.99, date(2026, 6, 2)),
    (3, "Monitor", 349.0, date(2026, 6, 3)),
]

with open("pedidos.csv", "w", encoding="utf-8", newline="") as f:
    escritor = csv.writer(f)
    escritor.writerow(["id", "producto", "precio", "fecha"])
    for pedido in pedidos:
        escritor.writerow(pedido)

csv.DictWriter: escribir con campos nombrados

import csv

usuarios = [
    {"nombre": "Ana", "email": "[email protected]", "rol": "admin"},
    {"nombre": "Luis", "email": "[email protected]", "rol": "user"},
]

with open("usuarios_nuevo.csv", "w", encoding="utf-8", newline="") as f:
    campos = ["nombre", "email", "rol"]
    escritor = csv.DictWriter(f, fieldnames=campos)
    escritor.writeheader()
    escritor.writerows(usuarios)

Dialectos y delimitadores alternativos

import csv

# TSV (tab-separated values)
with open("datos.tsv", encoding="utf-8", newline="") as f:
    lector = csv.reader(f, delimiter="t")
    for fila in lector:
        print(fila)

# Detectar dialecto automáticamente
with open("desconocido.csv", encoding="utf-8", newline="") as f:
    muestra = f.read(2048)
    f.seek(0)
    dialecto = csv.Sniffer().sniff(muestra)
    lector = csv.reader(f, dialect=dialecto)

Cuándo pasar a pandas

# Usar csv cuando:
# - El fichero cabe en memoria (o quieres procesarlo línea a línea)
# - Solo necesitas leer/escribir sin análisis estadístico
# - No quieres dependencias externas

# Pasar a pandas cuando:
# - Necesitas agrupar, filtrar por columna o hacer operaciones vectorizadas
# - El CSV tiene tipos mixtos que pandas detecta automáticamente
# - Necesitas merge de varios CSVs

import pandas as pd
df = pd.read_csv("datos.csv", encoding="utf-8")
print(df.groupby("departamento")["salario"].mean())

El módulo csv es la solución correcta para la mayoría de los casos de lectura y escritura de datos tabulares simples. Para análisis de datos o ficheros con miles de columnas, pandas ofrece una API mucho más expresiva.

COMPARTE ESTE ARTÍCULO

COMPARTIR EN FACEBOOK
COMPARTIR EN TWITTER
COMPARTIR EN LINKEDIN
COMPARTIR EN WHATSAPP