tutoriales.com

Explora y Manipula Datos Tabulares con `csv` en Python: Una Guía Esencial

Este tutorial te guiará a través del módulo `csv` de Python, una herramienta fundamental para trabajar con datos tabulares. Aprenderás a leer y escribir archivos CSV de manera eficiente, manejar diferentes delimitadores y gestionar encabezados, lo que es esencial para cualquier tarea de procesamiento de datos.

Principiante15 min de lectura20 views
Reportar error

¡Hola, entusiasta de Python! 👋 ¿Alguna vez te has encontrado con un archivo .csv y no sabes por dónde empezar? ¡No te preocupes! Los archivos CSV (Comma Separated Values) son omnipresentes en el mundo de los datos, desde hojas de cálculo hasta exportaciones de bases de datos. Afortunadamente, Python ofrece una herramienta robusta y fácil de usar para manejarlos: el módulo csv.

En este tutorial, exploraremos a fondo cómo usar este módulo para leer, escribir y manipular datos tabulares. Al final, tendrás las habilidades para integrar la gestión de CSV en tus propios proyectos de Python.


📖 ¿Qué son los Archivos CSV? Una Breve Introducción

Los archivos CSV son un formato de archivo de texto plano que utiliza comas (o cualquier otro delimitador) para separar valores. Cada línea en el archivo representa una fila de datos, y cada valor separado por comas representa una columna. Son increíblemente simples y por eso tan populares para el intercambio de datos.

📌 Nota: Aunque se llaman "Comma Separated Values", a menudo verás otros delimitadores como punto y coma (`;`), tabulaciones (`\t`) o incluso barras verticales (`|`). El módulo `csv` de Python puede manejar todos estos escenarios.

Formato Básico de un CSV

Considera el siguiente ejemplo:

Nombre,Edad,Ciudad
Alice,30,Nueva York
Bob,24,Londres
Charlie,35,París

Aquí, Nombre, Edad y Ciudad son los encabezados de las columnas, y cada línea subsiguiente es un registro de datos. Simple, ¿verdad?


🛠️ Configurando tu Entorno

¡La buena noticia es que no necesitas instalar nada! El módulo csv es parte de la biblioteca estándar de Python, lo que significa que ya lo tienes disponible con cualquier instalación de Python. Solo necesitas importarlo.

import csv

¡Así de fácil! Ahora, ¡manos a la obra!


🚀 Leyendo Archivos CSV

Leer archivos CSV es una de las tareas más comunes. El módulo csv ofrece varias formas de hacerlo, dependiendo de cómo quieras acceder a tus datos.

Leyendo CSVs como Listas de Strings (csv.reader)

La forma más básica de leer un archivo CSV es usar csv.reader. Esta función devuelve un objeto iterador que produce una lista de strings por cada fila.

  1. Crea un archivo CSV de ejemplo: Primero, vamos a crear un archivo llamado datos_ejemplo.csv con el siguiente contenido:
id,nombre,email,edad
1,Ana Lopez,ana.lopez@ejemplo.com,28
2,Juan Perez,juan.perez@ejemplo.com,34
3,Maria Garcia,maria.garcia@ejemplo.com,22
4,Carlos Ruiz,carlos.ruiz@ejemplo.com,45
  1. Lee el archivo con csv.reader:
import csv

with open('datos_ejemplo.csv', mode='r', newline='', encoding='utf-8') as archivo_csv:
lector_csv = csv.reader(archivo_csv)
for fila in lector_csv:
print(fila)
**Salida esperada:**
['id', 'nombre', 'email', 'edad']
['1', 'Ana Lopez', 'ana.lopez@ejemplo.com', '28']
['2', 'Juan Perez', 'juan.perez@ejemplo.com', '34']
['3', 'Maria Garcia', 'maria.garcia@ejemplo.com', '22']
['4', 'Carlos Ruiz', 'carlos.ruiz@ejemplo.com', '45']
<div class="callout important">🔥 <strong>Importante:</strong> El argumento `newline=''` es crucial al abrir archivos CSV. Evita que `csv.reader` interprete caracteres de nueva línea de forma incorrecta, lo que podría resultar en filas en blanco.</div>

Leyendo CSVs como Diccionarios (csv.DictReader)

Trabajar con listas de strings puede ser un poco tedioso si necesitas acceder a los datos por el nombre de la columna. Aquí es donde csv.DictReader brilla. Transforma cada fila en un diccionario, donde las claves son los encabezados de las columnas y los valores son los datos de la fila.

import csv

with open('datos_ejemplo.csv', mode='r', newline='', encoding='utf-8') as archivo_csv:
    lector_dict = csv.DictReader(archivo_csv)
    for fila in lector_dict:
        print(f"ID: {fila['id']}, Nombre: {fila['nombre']}, Email: {fila['email']}")
        # También puedes acceder a todas las claves:
        # print(fila)

Salida esperada:

ID: 1, Nombre: Ana Lopez, Email: ana.lopez@ejemplo.com
ID: 2, Nombre: Juan Perez, Email: juan.perez@ejemplo.com
ID: 3, Nombre: Maria Garcia, Email: maria.garcia@ejemplo.com
ID: 4, Nombre: Carlos Ruiz, Email: carlos.ruiz@ejemplo.com
💡 Consejo: `csv.DictReader` infiere automáticamente los nombres de los campos de la primera fila. Si tu archivo no tiene encabezados, puedes pasar una lista de nombres de campos al constructor `DictReader(archivo_csv, fieldnames=['col1', 'col2', 'col3'])`.

Manejando Delimitadores Diferentes

¿Qué pasa si tu archivo CSV usa punto y coma en lugar de comas? No hay problema, el módulo csv te permite especificar el delimitador.

  1. Crea datos_semicolon.csv:
id;nombre;ciudad
5;Elena Sanz;Madrid
6;Pedro Gomez;Barcelona
  1. Lee con delimiter=';':
import csv

with open('datos_semicolon.csv', mode='r', newline='', encoding='utf-8') as archivo_csv:
lector_csv = csv.reader(archivo_csv, delimiter=';')
for fila in lector_csv:
print(fila)
Esto es aplicable tanto a `csv.reader` como a `csv.DictReader`.

✍️ Escribiendo Archivos CSV

Además de leer, también es muy común la necesidad de escribir datos en un formato CSV. El módulo csv ofrece csv.writer y csv.DictWriter para estas tareas.

Escribiendo Listas de Strings (csv.writer)

csv.writer toma un objeto de archivo y se encarga de formatear tus datos (listas de strings) como filas CSV.

import csv

datos = [
    ['producto_id', 'nombre_producto', 'precio'],
    ['P001', 'Teclado Mecánico', 75.99],
    ['P002', 'Ratón Inalámbrico', 25.50],
    ['P003', 'Monitor 27 Pulgadas', 299.00]
]

with open('productos.csv', mode='w', newline='', encoding='utf-8') as archivo_salida:
    escritor_csv = csv.writer(archivo_salida)
    escritor_csv.writerows(datos) # writerows para múltiples filas, writerow para una sola

print("Archivo 'productos.csv' creado exitosamente.")

Si abres productos.csv, verás:

producto_id,nombre_producto,precio
P001,Teclado Mecánico,75.99
P002,Ratón Inalámbrico,25.5
P003,Monitor 27 Pulgadas,299.0
⚠️ Advertencia: Al escribir, el modo `w` (write) sobrescribirá el archivo si ya existe. Si quieres añadir datos, usa el modo `a` (append).

Escribiendo Diccionarios (csv.DictWriter)

Para cuando tus datos están organizados como una lista de diccionarios, csv.DictWriter es la opción ideal. Necesitas proporcionarle los fieldnames (nombres de las columnas) explícitamente.

import csv

datos_dict = [
    {'nombre': 'Laura', 'edad': 30, 'ciudad': 'Sevilla'},
    {'nombre': 'Miguel', 'edad': 25, 'ciudad': 'Valencia'},
    {'nombre': 'Sofía', 'edad': 38, 'ciudad': 'Málaga'}
]

# Definir los nombres de los campos (encabezados de las columnas)
fieldnames = ['nombre', 'edad', 'ciudad']

with open('usuarios.csv', mode='w', newline='', encoding='utf-8') as archivo_salida:
    escritor_dict = csv.DictWriter(archivo_salida, fieldnames=fieldnames)

    escritor_dict.writeheader() # Escribe la fila de encabezados
    escritor_dict.writerows(datos_dict) # Escribe las filas de datos

print("Archivo 'usuarios.csv' creado exitosamente.")

El contenido de usuarios.csv será:

nombre,edad,ciudad
Laura,30,Sevilla
Miguel,25,Valencia
Sofía,38,Málaga
💡 Consejo: `writeheader()` es un método muy útil de `DictWriter` que escribe automáticamente la primera fila con los nombres de los campos que especificaste en `fieldnames`.

✨ Opciones Avanzadas del Módulo csv

El módulo csv no se limita a los casos básicos. Ofrece varias opciones para manejar escenarios más complejos.

Controlando Citas y Espacios en Blanco

Algunos valores en CSV pueden contener comas, lo que podría causar problemas si no se manejan correctamente. Para esto, los CSV suelen encerrar dichos valores entre comillas dobles. csv.reader y csv.writer manejan esto automáticamente por defecto, pero puedes controlarlo con el parámetro quoting.

  • csv.QUOTE_MINIMAL: Cita solo los campos que contienen caracteres especiales (delimitador, quotechar o line terminators). (Por defecto para writer)
  • csv.QUOTE_ALL: Cita todos los campos.
  • csv.QUOTE_NONNUMERIC: Cita todos los campos que no son numéricos.
  • csv.QUOTE_NONE: No cita ningún campo. ¡Usa con precaución!

Ejemplo de escritura con quoting:

import csv

datos_complejos = [
    ['id', 'descripcion'],
    [1, 'Este texto, tiene comas'],
    [2, '"Este texto ya tenía comillas"'],
    [3, 'Un valor sin problemas']
]

with open('datos_complejos.csv', 'w', newline='', encoding='utf-8') as f:
    escritor = csv.writer(f, quoting=csv.QUOTE_ALL) # Cita todos los campos
    escritor.writerows(datos_complejos)

print("Archivo 'datos_complejos.csv' creado con quoting QUOTE_ALL.")

datos_complejos.csv:

"id","descripcion"
"1","Este texto, tiene comas"
"2","""Este texto ya tenía comillas"""
"3","Un valor sin problemas"
📌 Nota: Cuando un campo ya contiene comillas, el `writer` las escapa duplicándolas, como en el ejemplo `""Este texto ya tenía comillas"""`.

Trabajando con Diferentes Dialectos CSV

Un "dialecto" en el módulo csv es un conjunto de parámetros que definen la forma en que un archivo CSV debe ser leído o escrito. Esto incluye el delimitador, el carácter de comillas (quotechar), si se deben ignorar los espacios (skipinitialspace), etc.

Puedes crear tus propios dialectos o usar los predefinidos.

Ejemplo de registro de un dialecto personalizado:

import csv

# Registra un nuevo dialecto llamado 'semicolon_excel'
csv.register_dialect(
    'semicolon_excel',
    delimiter=';',
    quotechar='"',
    quoting=csv.QUOTE_MINIMAL,
    skipinitialspace=True
)

datos_personalizados = [
    ['col1', 'col2', 'col3 con ;'],
    ['valor1', 'valor2', 'un texto; con punto y coma'],
    ['valor3', 'valor4', 'otro valor']
]

with open('custom_dialect.csv', 'w', newline='', encoding='utf-8') as f:
    escritor = csv.writer(f, dialect='semicolon_excel')
    escritor.writerows(datos_personalizados)

print("Archivo 'custom_dialect.csv' creado con dialecto personalizado.")

# Leer con el mismo dialecto
with open('custom_dialect.csv', 'r', newline='', encoding='utf-8') as f:
    lector = csv.reader(f, dialect='semicolon_excel')
    for fila in lector:
        print(fila)

Salida (lectura):

['col1', 'col2', 'col3 con ;']
['valor1', 'valor2', 'un texto; con punto y coma']
['valor3', 'valor4', 'otro valor']

El archivo custom_dialect.csv se verá así:

col1;col2;"col3 con ;"
valor1;valor2;"un texto; con punto y coma"
valor3;valor4;otro valor

📊 Caso Práctico: Filtrado y Transformación de Datos CSV

Para consolidar lo aprendido, hagamos un ejemplo más completo: leeremos un archivo CSV de estudiantes, filtraremos a los que tienen una nota aprobatoria y guardaremos sus datos en un nuevo CSV.

  1. Crea notas_estudiantes.csv:
id,nombre,asignatura,nota
101,Ana Pérez,Matemáticas,8.5
102,Juan García,Historia,6.2
103,María López,Ciencias,9.1
104,Pedro Sánchez,Literatura,4.9
105,Laura Gómez,Matemáticas,7.8
106,David Ruiz,Física,5.5
  1. Script de Python para filtrar:
import csv

input_file = 'notas_estudiantes.csv'
output_file = 'estudiantes_aprobados.csv'
NOTA_APROBATORIA = 6.0

estudiantes_aprobados = []
fieldnames = [] # Para almacenar los encabezados

# Paso 1: Leer el archivo de entrada
with open(input_file, mode='r', newline='', encoding='utf-8') as infile:
reader = csv.DictReader(infile)
fieldnames = reader.fieldnames # Obtener los encabezados

for row in reader:
try:
# Convertir la nota a float para la comparación
if float(row['nota']) >= NOTA_APROBATORIA:
estudiantes_aprobados.append(row)
except ValueError:
print(f"⚠️ Advertencia: Nota inválida para el estudiante {row['nombre']}. Saltando fila.")

# Paso 2: Escribir los datos filtrados en un nuevo archivo CSV
if estudiantes_aprobados:
with open(output_file, mode='w', newline='', encoding='utf-8') as outfile:
writer = csv.DictWriter(outfile, fieldnames=fieldnames)
writer.writeheader()
writer.writerows(estudiantes_aprobados)
print(f"✅ Archivo '{output_file}' creado con {len(estudiantes_aprobados)} estudiantes aprobados.")
else:
print(f"❌ No se encontraron estudiantes con nota mayor o igual a {NOTA_APROBATORIA}.")

Salida de estudiantes_aprobados.csv:

id,nombre,asignatura,nota
101,Ana Pérez,Matemáticas,8.5
102,Juan García,Historia,6.2
103,María López,Ciencias,9.1
105,Laura Gómez,Matemáticas,7.8

Este ejemplo ilustra la potencia de combinar DictReader para una lectura semántica y DictWriter para una escritura controlada, manejando los encabezados automáticamente.


🧠 Comparativa: csv.reader vs csv.DictReader

Es importante saber cuándo usar cada uno, ya que impacta la legibilidad y la facilidad de mantenimiento de tu código.

Característicacsv.reader (o writer)csv.DictReader (o DictWriter)
---------
Tipo de datosListas de strings por filaDiccionarios por fila
Acceso a columnasPor índice (ej. fila[0])Por nombre de columna (ej. fila['id'])
---------
Manejo de encabezadosNo automático, debes gestionarloAutomático, usa la primera fila como claves
FlexibilidadMayor control sobre el formato de filaIdeal para datos con encabezados claros
---------
Uso comúnCSVs sin encabezados o lectura/escritura sencillaCSVs con encabezados, manipulación de datos
CódigoMás manual para acceder a datos por nombreMás legible y robusto con encabezados
60% Uso de DictReader/DictWriter
40% Uso de reader/writer

🚧 Consideraciones y Buenas Prácticas

  • Manejo de errores: Siempre considera el try-except al convertir tipos de datos (como hicimos con float(row['nota'])) o al acceder a claves de diccionario que podrían no existir.
  • Codificación de caracteres (encoding): Usa encoding='utf-8' de forma predeterminada, ya que es el estándar universal y cubre la mayoría de los caracteres. Si tienes problemas, verifica la codificación original del archivo (por ejemplo, con chardet).
  • Context Managers (with open(...)): Siempre utiliza with open(...) para asegurar que los archivos se cierren correctamente, incluso si ocurren errores.
  • Archivos grandes: Para archivos CSV extremadamente grandes, el módulo csv es eficiente porque lee los datos fila por fila (iteradores), lo que reduce el uso de memoria en comparación con cargar todo el archivo a la vez.
Inicio Abrir CSV (Lectura) Leer fila (DictReader) ¿Hay más filas? Si Procesar (Filtrar) Almacenar No Cerrar archivo (Lectura) ¿Hay resultados? No "No resultados" Si Abrir (Escritura) Escribir encabezados Escribir resultados Cerrar archivo Fin

Conclusión 🎉

¡Felicidades! Has completado una inmersión profunda en el módulo csv de Python. Ahora tienes las herramientas para leer, escribir y manipular datos tabulares con confianza. Ya sea que estés procesando logs, importando configuraciones o exportando resultados de análisis, el módulo csv será un aliado invaluable en tu arsenal de Python.

Recuerda practicar estos conceptos con tus propios datos. ¡La mejor manera de aprender es haciendo!

Tutoriales relacionados

Comentarios (0)

Aún no hay comentarios. ¡Sé el primero!