Los archivos CSV aparecen en exportaciones de hojas de cálculo, informes de ventas, listas de contactos, descargas de análisis y transferencias entre sistemas. Aunque el nombre significa valores separados por comas, un archivo real puede usar punto y coma, tabulaciones, campos entre comillas o saltos de línea dentro de una celda.
El módulo estándar csv maneja estas reglas mejor que dividir texto manualmente. En esta guía aprenderás a leer, escribir, filtrar, validar y transformar archivos CSV en Python con las APIs basadas en listas y diccionarios.
Por qué no usar split(‘,’)
linea.split(",") falla cuando un campo contiene una coma entre comillas, cuando las comillas están escapadas o cuando el archivo usa otro delimitador. El parser del módulo csv reconoce estas convenciones.
Para comprender mejor la lectura básica, revisa la guía de archivos de texto en Python.
Leer un CSV con csv.reader
import csv
with open("ventas.csv", newline="", encoding="utf-8") as archivo:
lector = csv.reader(archivo)
for fila in lector:
print(fila)Utiliza newline="" para que el módulo controle correctamente los saltos de línea. Cada fila se devuelve como una lista de strings.
Convertir números
import csv
total = 0.0
with open("ventas.csv", newline="", encoding="utf-8") as archivo:
lector = csv.reader(archivo)
encabezado = next(lector)
for producto, cantidad_texto, precio_texto in lector:
cantidad = int(cantidad_texto)
precio = float(precio_texto)
total += cantidad * precio
print(f"Total: {total:.2f}")CSV no contiene un esquema universal. Debes convertir y validar cada columna según las reglas de tu aplicación.
Leer filas como diccionarios
import csv
with open("personas.csv", newline="", encoding="utf-8") as archivo:
lector = csv.DictReader(archivo)
for fila in lector:
print(fila["nombre"], fila["correo"])DictReader usa la primera fila como nombres de columnas. Esto hace el código más legible y evita depender de posiciones. La guía de diccionarios en Python explica las operaciones utilizadas.
Escribir datos con csv.writer
import csv
filas = [
["nombre", "puntuacion"],
["Maya", 92],
["Noah", 87],
["Liam", 95],
]
with open("puntuaciones.csv", "w", newline="", encoding="utf-8") as archivo:
escritor = csv.writer(archivo)
escritor.writerows(filas)El modo w reemplaza el archivo existente. Confirma que el destino sea correcto antes de escribir.
Escribir diccionarios con DictWriter
import csv
registros = [
{"nombre": "Maya", "puntuacion": 92},
{"nombre": "Noah", "puntuacion": 87},
]
campos = ["nombre", "puntuacion"]
with open("puntuaciones.csv", "w", newline="", encoding="utf-8") as archivo:
escritor = csv.DictWriter(archivo, fieldnames=campos)
escritor.writeheader()
escritor.writerows(registros)DictWriter necesita un orden explícito de columnas y puede detectar claves inesperadas.
Usar punto y coma o tabulaciones
import csv
with open("productos.csv", newline="", encoding="utf-8") as archivo:
lector = csv.DictReader(archivo, delimiter=";")
for fila in lector:
print(fila)Para archivos TSV utiliza delimiter="\t". Es mejor conocer el formato que depender únicamente de una detección automática.
Filtrar y transformar filas
import csv
with open("usuarios.csv", newline="", encoding="utf-8") as origen:
lector = csv.DictReader(origen)
limpios = []
for fila in lector:
if fila["activo"].strip().lower() != "si":
continue
limpios.append({
"nombre": fila["nombre"].strip().title(),
"correo": fila["correo"].strip().lower(),
})
with open("usuarios_activos.csv", "w", newline="", encoding="utf-8") as destino:
escritor = csv.DictWriter(
destino,
fieldnames=["nombre", "correo"],
)
escritor.writeheader()
escritor.writerows(limpios)Cuando el archivo es grande, escribe cada resultado inmediatamente en lugar de almacenar toda la lista.
Procesar archivos grandes por streaming
import csv
with (
open("eventos.csv", newline="", encoding="utf-8") as origen,
open("errores.csv", "w", newline="", encoding="utf-8") as destino,
):
lector = csv.DictReader(origen)
escritor = csv.DictWriter(
destino,
fieldnames=lector.fieldnames or [],
)
escritor.writeheader()
for fila in lector:
if fila.get("nivel") == "ERROR":
escritor.writerow(fila)Los lectores CSV son iteradores, por lo que producen filas según se necesitan.
Validar columnas obligatorias
import csv
obligatorias = {"nombre", "correo", "activo"}
with open("usuarios.csv", newline="", encoding="utf-8") as archivo:
lector = csv.DictReader(archivo)
actuales = set(lector.fieldnames or [])
faltantes = obligatorias - actuales
if faltantes:
nombres = ", ".join(sorted(faltantes))
raise ValueError(f"Faltan columnas: {nombres}")Los conjuntos facilitan las comparaciones de esquemas. Consulta la guía de sets en Python.
Informar filas inválidas
import csv
with open("pedidos.csv", newline="", encoding="utf-8") as archivo:
lector = csv.DictReader(archivo)
for numero_fila, fila in enumerate(lector, start=2):
try:
cantidad = int(fila["cantidad"])
precio = float(fila["precio"])
except (KeyError, TypeError, ValueError) as error:
print(f"Fila {numero_fila} omitida: {error}")
continue
print(cantidad * precio)enumerate() en Python permite mostrar el número real de la fila. Para controlar las excepciones con precisión, revisa try y except en Python.
Fechas y valores ausentes
Un campo vacío, el texto NULL y una columna omitida pueden tener significados distintos. Define una política de conversión.
from datetime import date
def analizar_fecha(valor):
valor = valor.strip()
if not valor:
return None
return date.fromisoformat(valor)CSV o pandas
El módulo estándar es ideal para streaming, transformaciones simples y bajo consumo de dependencias. Pandas suele ser más productivo para análisis, joins, agrupaciones, valores ausentes y cálculos por columnas.
Errores frecuentes
- Procesar filas con
split(","). - Olvidar
newline="". - Suponer que los valores se convierten automáticamente.
- Ignorar la codificación.
- Cargar un archivo enorme en una lista.
- No validar encabezados.
- Sobrescribir el archivo original antes de verificar el resultado.
Conclusión
El procesamiento fiable de archivos CSV en Python comienza con el parser estándar, UTF-8 explícito, newline="", reglas de columnas documentadas y mensajes de error específicos. Procesa archivos grandes por streaming y utiliza pandas solamente cuando sus herramientas de análisis aporten un beneficio real.
Documentación y estándar
Consulta la documentación oficial de Python sobre el módulo csv y el RFC 4180, la referencia histórica más utilizada para el formato CSV.






