Archivos CSV en Python: leer, escribir y procesar

Actualizado el: 11/07/2026
Tempo de leitura: 3 minutos
Leitura e escrita de arquivos CSV em Python

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.

Compartilhe:

Facebook
WhatsApp
Twitter
LinkedIn

Contenido del artículo

    Artículos relacionados

    Uso do operador in em Python para verificação em coleções
    Fundamentos
    Foto de perfil de Leandro Hirt da Academify

    Operador in en Python: pruebas de pertenencia

    Aprende a usar el operador in en Python con strings, listas, sets, diccionarios, rangos, generadores, not in y clases personalizadas.

    Ler mais

    Tempo de leitura: 3 minutos
    11/07/2026
    Introdução ao Python para iniciantes
    Fundamentos
    Foto de perfil de Leandro Hirt da Academify

    List comprehensions en Python: guía completa

    Aprende list comprehensions en Python con transformaciones, filtros, condiciones, bucles anidados, diccionarios, sets y generadores.

    Ler mais

    Tempo de leitura: 3 minutos
    11/07/2026
    Fatiamento de listas (slicing) em Python
    Fundamentos
    Foto de perfil de Leandro Hirt da Academify

    Slicing en Python: guía completa con ejemplos

    Domina el slicing en Python con start, stop, step, índices negativos, copias, reemplazos, eliminación, inversión y ejemplos prácticos.

    Ler mais

    Tempo de leitura: 3 minutos
    11/07/2026
    Leitura e escrita de arquivos TXT usando Python
    Fundamentos
    Foto de perfil de Leandro Hirt da Academify

    Cómo leer y escribir archivos de texto en Python

    Aprende a leer, escribir, añadir y procesar archivos de texto en Python con UTF-8, with, pathlib y manejo seguro de

    Ler mais

    Tempo de leitura: 4 minutos
    11/07/2026
    Pessoa usando tablet com caneta digital para planejar tarefas em checklist, representando organização, planejamento e produtividade digital.
    Fundamentos
    Foto de perfil de Leandro Hirt da Academify

    sort() vs sorted() en Python: diferencias y ejemplos

    Aprende las diferencias entre sort() y sorted() en Python, con claves personalizadas, orden descendente, varios criterios y errores comunes.

    Ler mais

    Tempo de leitura: 3 minutos
    11/07/2026
    Uso da função enumerate em loops Python
    Fundamentos
    Foto de perfil de Leandro Hirt da Academify

    enumerate() en Python: bucles con índices

    Aprende enumerate() en Python para recorrer valores con índices, elegir el inicio, combinarlo con zip, procesar archivos y evitar contadores

    Ler mais

    Tempo de leitura: 3 minutos
    11/07/2026