🇯🇵 日本語 | 🇺🇸 English | 🇪🇸 Español | 🇵🇹 Português | 🇹🇭 ไทย | 🇨🇳 中文

[Python] ¡La guía completa del módulo csv! Explicación detallada de los problemas comunes para principiantes al leer y escribir CSV

Para ejecutar Python desde el símbolo del sistema o PowerShell en tu PC, necesitas descargar e instalar Python.
Si aún no lo has hecho, consulta el artículo Instalación de Python y configuración del entorno de desarrollo para instalar Python.

"Quiero manejar archivos CSV en mi programación, pero no sé por dónde empezar..."

¡Hola! Soy el administrador de este sitio, y hace solo unos meses, era un completo principiante como tú. Déjame decirte algo desde mi experiencia de lanzar dos sitios web por mi cuenta en un mes y medio con la ayuda de la IA: ¡manejar archivos CSV es una habilidad inevitable e increíblemente útil en el desarrollo web!

De hecho, este conocimiento sobre CSV me ayudó enormemente cuando estaba creando funciones para gestionar datos de formularios de contacto o para cargar listas de productos en bloque.

En este artículo, basándome en mis experiencias reales (y muchos fracasos...), te explicaré cómo leer y escribir archivos CSV a tu antojo usando el módulo `csv` de Python de la forma más sencilla posible. Evitaré la jerga técnica todo lo que pueda. ¡Cuando termines de leer este artículo, serás un maestro del CSV!


Calentamiento: Prepara un archivo CSV de muestra

Primero, vamos a conseguir un archivo CSV para practicar. Copia el siguiente contenido y guárdalo en tu PC como `miembros.csv`. La clave es guardarlo con la codificación UTF-8. (Cuando guardas en el Bloc de notas, debería haber una opción para la codificación).

Este archivo representa una lista de miembros de un sitio web ficticio.

id,nombre,email
1,Juan Pérez,juan.perez@example.com
2,María García,maria.garcia@example.com
3,Carlos Rodríguez,carlos.rodriguez@example.com

Lo básico: Leamos un archivo CSV (`csv.reader`)

Lo primero que haremos es leer el contenido de un archivo CSV con Python. Leamos el archivo `miembros.csv` que acabamos de crear y mostremos su contenido en la consola.

¡Muy bien, empecemos con el código! Cópialo, pégalo y ejecútalo. La forma más fácil es crear un archivo Python en el mismo directorio que `miembros.csv` y ejecutarlo.

<!-- Código Python con escape HTML -->
import csv

# --- Mi punto de atasco n.º 1: ¡Especificar siempre la codificación de caracteres! ---
# En Windows, si no especificas una codificación, podría intentar
# abrir el archivo con Shift_JIS y provocar un error.
# Usa `encoding='utf-8'` como si fuera un amuleto.
with open('miembros.csv', mode='r', encoding='utf-8') as f:
    
    # Al pasar el archivo a csv.reader, devuelve un objeto lector que procesa el CSV
    reader = csv.reader(f)
    
    # Puedes procesarlo línea por línea en un bucle
    for row in reader:
        print(row)

# Resultado de la ejecución:
# ['id', 'nombre', 'email']
# ['1', 'Juan Pérez', 'juan.perez@example.com']
# ['2', 'María García', 'maria.garcia@example.com']
# ['3', 'Carlos Rodríguez', 'carlos.rodriguez@example.com']

¿Qué tal ha ido? ¿Apareció el contenido del CSV en tu terminal?
El punto clave a notar es que cada fila se recupera como una lista (lo que está entre `[]`). Los datos separados por comas, como `['1', 'Juan Pérez', 'juan.perez@example.com']`, se convierten en elementos de la lista.

Una breve explicación: ¿Qué es `with open(...) as f:`?
Esta es la "buena práctica" estándar para manejar archivos. Al escribirlo de esta manera, Python cierra automáticamente el archivo por ti cuando sales del bloque `with`. Olvidarse de cerrar un archivo puede llevar a problemas inesperados como fugas de memoria, ¡así que usa siempre `with`!

[Mi historia de fracaso n.º 1] El infierno del texto corrupto y `encoding`

La primera vez que hice esto, especialmente en un PC con Windows, mi consola se llenó de símbolos sin sentido (texto corrupto). La causa era la codificación de caracteres. Tienes que decirle al PC con qué regla de idioma (codificación) está escrito el archivo, o no podrá leerlo correctamente.

La solución es añadir `encoding='utf-8'` a los argumentos de la función `open()`. `UTF-8` es el estándar mundial para la codificación de caracteres, y usarlo solucionará la mayoría de los problemas. ¡Es un conocimiento esencial en el mundo web, así que hazlo un hábito!


Lo básico (parte 2): Escribamos en un nuevo archivo CSV (`csv.writer`)

Lo siguiente es escribir datos. Intentemos guardar datos de una lista creados en Python en un nuevo archivo CSV. Por ejemplo, imagina que escribes datos de nuevos miembros en un archivo llamado `nuevos_miembros.csv`.

<!-- Código Python con escape HTML -->
import csv

# Datos a escribir (una lista de listas)
new_data = [
    ['4', 'Luis Hernández', 'luis.hernandez@example.com'],
    ['5', 'Ana Martínez', 'ana.martinez@example.com']
]

# --- Mi punto de atasco n.º 2: Usa newline='' para las misteriosas filas en blanco ---
# mode='w' para el modo de escritura. Si el archivo no existe, se creará.
# ¡Sin newline='', obtendrás una misteriosa línea en blanco entre cada línea en Windows!
with open('nuevos_miembros.csv', mode='w', encoding='utf-8', newline='') as f:
    
    writer = csv.writer(f)
    
    # Para escribir una sola fila, usa writerow
    writer.writerow(['id', 'nombre', 'email']) # Fila de encabezado
    
    # Para escribir múltiples filas a la vez, usa writerows
    writer.writerows(new_data)

print('¡Se ha creado nuevos_miembros.csv!')

Cuando ejecutes este código, debería crearse un archivo llamado `nuevos_miembros.csv` en el mismo directorio. Ábrelo. Los datos están escritos correctamente, ¿verdad?

[Mi historia de fracaso n.º 2] ¿¡Y tú quién eres!? La misteriosa línea en blanco y `newline=''`

Este es otro problema que me costó medio día. Intenta ejecutar el código anterior después de eliminar `newline=''`. ¿Qué tal? ¿No se llenó tu archivo CSV de molestas líneas en blanco entre cada línea?

Esta es una trampa común causada por las diferencias en cómo los sistemas operativos manejan los caracteres de nueva línea. Me saltaré la explicación detallada (le pregunté a una IA y me quedé como, "¡Entiendo, pero no lo pillo!"), pero la solución es simple.

¡Cuando escribas en un CSV, incluye siempre `newline=''` en la función `open()`!

Esta es una práctica súper importante que incluso está escrita en la documentación oficial de Python, que dice: "Si estás usando el módulo csv, siempre deberías especificarlo". Simplemente recuérdalo como un hechizo mágico.


Consejo avanzado n.º 1: Usar diccionarios hace tu código legible a nivel divino (`DictReader` y `DictWriter`)

Con el `reader` básico, tenías que gestionar los datos por su número de índice, como `row[1]` o `row[2]`. Cuando el número de columnas aumenta, terminas preguntándote: "Espera, ¿qué índice era la dirección de correo electrónico...?"

¡Ahí es donde entra `DictReader`! Te permite obtener cada fila de datos como un "diccionario". Esto significa que puedes acceder a los datos por el nombre del encabezado, como `row['nombre']` o `row['email']`. ¡Genial, verdad?

Lectura: `DictReader`

<!-- Código Python con escape HTML -->
import csv

with open('miembros.csv', mode='r', encoding='utf-8') as f:
    # ¡Solo usa DictReader! ¡Fácil!
    # Accede al nombre con la clave 'nombre' y al email con la clave 'email'.
    reader = csv.DictReader(f)
    
    for row in reader:
        print(f"Nombre: {row['nombre']}, Email: {row['email']}")

# Resultado de la ejecución:
# Nombre: Juan Pérez, Email: juan.perez@example.com
# Nombre: María García, Email: maria.garcia@example.com
# Nombre: Carlos Rodríguez, Email: carlos.rodriguez@example.com

¿Ves? `row['nombre']` es abrumadoramente más fácil de entender que `row[1]`, ¿no crees? De esta manera, cuando revises tu código más tarde, será inmediatamente obvio lo que está haciendo.

Escritura: `DictWriter`

Si puedes leer con un diccionario, querrás escribir con uno también. Por supuesto, existe `DictWriter`. Si preparas una lista de diccionarios, puedes escribirla en un CSV.

<!-- Código Python con escape HTML -->
import csv

# Prepara los datos como una lista de diccionarios
dict_data = [
    {'id': '6', 'nombre': 'David López', 'email': 'david.lopez@example.com'},
    {'id': '7', 'nombre': 'Sofía González', 'email': 'sofia.gonzalez@example.com'}
]

# La lista de encabezados (¡importante!)
fieldnames = ['id', 'nombre', 'email']

with open('dict_miembros.csv', mode='w', encoding='utf-8', newline='') as f:
    # Pasa el archivo y los encabezados (fieldnames) a DictWriter
    writer = csv.DictWriter(f, fieldnames=fieldnames)
    
    # ¡No olvides escribir primero el encabezado!
    writer.writeheader()
    
    # Escribe la lista de diccionarios de una vez
    writer.writerows(dict_data)

print('¡Se ha creado dict_miembros.csv!')

Hay dos cosas con las que tener cuidado al usar `DictWriter`:

  1. Cuando inicializas `csv.DictWriter()`, necesitas pasarle los `fieldnames` (la lista de encabezados).
  2. Antes de escribir los datos, necesitas escribir la fila de encabezado con `writer.writeheader()`.

Si olvidas esto, no se escribirá correctamente, ¡así que ten cuidado! (Por supuesto, yo cometí ese error).


Consejo avanzado n.º 2: Añadir datos a un CSV existente

"Quiero añadir nueva información de miembros a la lista cada vez que se envía un formulario de contacto". En ese caso, abres el archivo en "modo de anexo" (append).

Es súper fácil. Simplemente cambia el `mode` en `open()` de `'w'` (write) a `'a'` (append).

<!-- Código Python con escape HTML -->
import csv

# Nuevos datos de miembro para añadir
new_member = ['8', 'Laura Sánchez', 'laura.sanchez@example.com']

# ¡Solo cambia el modo a 'a' (append)!
# Como estamos añadiendo, no olvides newline='' y encoding='utf-8'.
with open('miembros.csv', mode='a', encoding='utf-8', newline='') as f:
    writer = csv.writer(f)
    writer.writerow(new_member)

print('¡Datos añadidos a miembros.csv!')

Después de ejecutar este código, abre `miembros.csv` de nuevo. Deberías ver la información de Laura Sánchez añadida al final. Cuando añadas con `DictWriter`, ten cuidado de no llamar a `writeheader()`. De lo contrario, se añadirá un encabezado cada vez que añadas datos.


[Pruébalo en vivo] ¡Juguemos con CSV en el navegador!

Bueno, hemos visto mucho código hasta ahora. Pero la mejor manera de aprender es ejecutarlo y experimentar por ti mismo.

Así que esta vez, he preparado una demostración interactiva usando "PyScript", una tecnología mágica que te permite ejecutar Python en tu navegador, ¡para que puedas manipular datos CSV en tiempo real!

Copia todo el código HTML a continuación y guárdalo en tu PC con un nombre como `csv_test.html`. Luego, abre ese archivo en tu navegador web. ¡Así de fácil, tu navegador se convertirá en un editor de CSV!

<!-- Código HTML con escape HTML -->
<!DOCTYPE html>
<html lang="es">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Demo Interactiva del Módulo CSV de Python</title>
    <!-- Cargando PyScript -->
    <link rel="stylesheet" href="https://pyscript.net/releases/2024.1.1/core.css" />
    <script type="module" src="https://pyscript.net/releases/2024.1.1/core.js"></script>
    <!-- Estilos simples -->
    <style>
        body { font-family: sans-serif; background-color: #202124; color: #e8eaed; padding: 2em; line-height: 1.6; }
        h1, h2 { color: #8ab4f8; }
        textarea, button {
            border: 1px solid #5f6368;
            background-color: #3c4043;
            color: #e8eaed;
            border-radius: 4px;
            padding: 0.5em 1em;
        }
        textarea { width: 100%; height: 150px; margin-bottom: 1em; font-family: monospace; }
        button { cursor: pointer; margin-right: 1em; }
        button:hover { background-color: #5f6368; }
        table { border-collapse: collapse; width: 100%; margin-top: 1em; }
        th, td { border: 1px solid #5f6368; padding: 8px; text-align: left; }
        th { background-color: #3c4043; }
        pre { background-color: #1e1e1e; padding: 1em; border-radius: 4px; white-space: pre-wrap; }
    </style>
</head>
<body>
    <h1>¡Experimenta el Módulo CSV de Python en tu Navegador!</h1>
    <p>Introduce o edita los datos CSV en el área de texto de abajo, luego presiona el botón "Cargar CSV y Mostrar como Tabla".</p>

    <textarea id="csv-input">Nombre,Edad,Ciudad
Juan Pérez,32,Tokio
María García,28,Osaka
Carlos Rodríguez,45,Fukuoka</textarea>

    <button py-click="read_csv">Cargar CSV y Mostrar como Tabla</button>

    <h2>Resultado de la Carga</h2>
    <div id="table-output"></div>

    <py-script>
# El código Python a continuación se ejecuta en tu navegador
import csv
import io # Un módulo para tratar cadenas de texto como archivos
from pyscript import document

def read_csv(*args, **kwargs):
    # Obtiene los datos CSV del área de texto
    csv_data = document.querySelector("#csv-input").value
    
    # Usa io.StringIO para tratar la cadena como un archivo.
    # Esto permite que el módulo csv se use como si
    # estuviera leyendo de un archivo.
    csv_file = io.StringIO(csv_data)
    
    # Lee con csv.reader
    reader = csv.reader(csv_file)
    
    # Genera una tabla HTML
    html = "<table>"
    try:
        # Procesa la primera fila (encabezado)
        header = next(reader)
        html += "<thead><tr>"
        for col in header:
            html += f"<th>{col}</th>"
        html += "</tr></thead>"
        
        # Procesa la segunda fila en adelante (datos)
        html += "<tbody>"
        for row in reader:
            html += "<tr>"
            for cell in row:
                html += f"<td>{cell}</td>"
            html += "</tr>"
        html += "</tbody>"
    except StopIteration:
        # Manejo para cuando no hay datos
        html += "<tr><td>No hay datos disponibles</td></tr>"

    html += "</table>"
    
    # Muestra el resultado en el elemento DIV
    output_div = document.querySelector("#table-output")
    output_div.innerHTML = html
    </py-script>
</body>
</html>

Siéntete libre de cambiar el contenido del área de texto y presionar el botón. Verás cómo el texto separado por comas se transforma en una tabla ordenada. ¡Este es el poder del módulo `csv`! Por favor, juega con él.


Conclusión: ¡Ya has dominado el CSV!

¡Buen trabajo! Ha sido un largo viaje, pero ahora has dominado completamente todo, desde lo básico hasta los usos avanzados de la manipulación de CSV con Python. Repasemos rápidamente los puntos más importantes que hemos aprendido hoy.

Si tienes en cuenta estos puntos, rara vez tendrás problemas al manejar CSV en tu trabajo. Puedes analizar datos descargados de sitios web, o registrar grandes cantidades de datos en un sistema de forma masiva. Las posibilidades son infinitas, dependiendo de tus ideas.

El truco para mejorar en la programación es acumular estos momentos de "¡Funcionó!", uno por uno. Si este artículo te ha ayudado en ese viaje, no podría estar más feliz.

Próximos pasos

Otro formato de datos que se usa tanto como CSV en el desarrollo web es "JSON". Es un conocimiento esencial para un desarrollo más avanzado, como la integración de API. ¡Domínalo en el siguiente artículo para subir aún más de nivel!

Cómo manejar datos JSON con el módulo json