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.
