Ir al contenido principal

Trabajando con archivos CSV

Introducción

Los archivos CSV (Comma-Separated Values) son uno de los formatos más populares para almacenar y compartir datos tabulares. Estos archivos representan datos en formato de texto plano donde cada línea es un registro y los valores están separados por un delimitador, generalmente una coma. Python ofrece herramientas potentes y flexibles para leer, procesar y escribir archivos CSV, convirtiéndolo en una excelente opción para el análisis y manipulación de datos.

En este artículo, aprenderás a trabajar con archivos CSV utilizando el módulo csv de la biblioteca estándar de Python. Descubrirás cómo leer datos de archivos CSV, manipularlos y crear nuevos archivos en este formato. Estas habilidades son fundamentales para tareas relacionadas con el análisis de datos, la ciencia de datos y muchas aplicaciones empresariales.

Desarrollo detallado

El módulo csv

Python incluye el módulo csv en su biblioteca estándar, diseñado específicamente para trabajar con este formato. Veamos cómo importarlo:

import csv

Este módulo proporciona clases y funciones que facilitan la lectura y escritura de archivos CSV de manera eficiente y robusta.

Lectura de archivos CSV

Existen varias formas de leer un archivo CSV en Python. Veamos las más comunes:

Usando csv.reader()

La función reader() del módulo csv crea un objeto que puede iterar sobre las líneas del archivo CSV:

import csv

# Abrimos el archivo
with open('datos.csv', 'r', encoding='utf-8') as archivo:
    # Creamos el lector CSV
    lector_csv = csv.reader(archivo)
    
    # Iteramos por cada fila
    for fila in lector_csv:
        print(fila)  # Cada fila es una lista de valores

En este ejemplo:

  • Abrimos el archivo en modo lectura ('r')
  • Especificamos la codificación UTF-8 para manejar correctamente caracteres especiales
  • Creamos un objeto reader que nos permite iterar sobre cada fila
  • Cada fila se representa como una lista de cadenas

Especificando un delimitador diferente

Aunque el delimitador predeterminado es la coma, puedes especificar otro carácter:

# Para archivos que usan punto y coma como separador (común en países que usan la coma como decimal)
with open('datos_espana.csv', 'r', encoding='utf-8') as archivo:
    lector_csv = csv.reader(archivo, delimiter=';')
    for fila in lector_csv:
        print(fila)

Usando csv.DictReader()

Para trabajar con datos de manera más intuitiva, DictReader trata la primera fila como encabezados y devuelve cada fila como un diccionario:

import csv

with open('empleados.csv', 'r', encoding='utf-8') as archivo:
    # DictReader utiliza la primera fila como nombres de campo
    lector_dict = csv.DictReader(archivo)
    
    # Iteramos por cada fila
    for fila in lector_dict:
        # Accedemos a los valores por nombre de columna
        print(f"Nombre: {fila['nombre']}, Edad: {fila['edad']}, Puesto: {fila['puesto']}")

Este enfoque tiene varias ventajas:

  • Acceso a los datos por nombre de columna en lugar de índice
  • El código es más legible y mantenible
  • Es más robusto ante cambios en el orden de las columnas

Escritura de archivos CSV

Python también facilita la creación y escritura de archivos CSV.

Usando csv.writer()

import csv

# Datos a escribir
datos = [
    ['Nombre', 'Edad', 'Ciudad'],
    ['Ana', '28', 'Madrid'],
    ['Pedro', '34', 'Barcelona'],
    ['Lucía', '42', 'Valencia']
]

# Escribimos en el archivo
with open('personas.csv', 'w', newline='', encoding='utf-8') as archivo:
    escritor_csv = csv.writer(archivo)
    
    # Escribimos múltiples filas
    escritor_csv.writerows(datos)
    
    # También podemos escribir fila por fila
    # for fila in datos:
    #     escritor_csv.writerow(fila)

Observaciones importantes:

  • Usamos newline='' para evitar líneas adicionales en el archivo resultante
  • writerows() escribe todas las filas de una vez
  • writerow() escribe una sola fila

Usando csv.DictWriter()

Para escribir datos desde diccionarios:

import csv

# Datos en formato de diccionarios
datos = [
    {'nombre': 'Ana', 'edad': '28', 'ciudad': 'Madrid'},
    {'nombre': 'Pedro', 'edad': '34', 'ciudad': 'Barcelona'},
    {'nombre': 'Lucía', 'edad': '42', 'ciudad': 'Valencia'}
]

# Definimos los nombres de las columnas
campos = ['nombre', 'edad', 'ciudad']

with open('personas_dict.csv', 'w', newline='', encoding='utf-8') as archivo:
    # Creamos el escritor especificando los nombres de campo
    escritor_dict = csv.DictWriter(archivo, fieldnames=campos)
    
    # Escribimos la fila de encabezados
    escritor_dict.writeheader()
    
    # Escribimos los datos
    escritor_dict.writerows(datos)

Este método es ideal cuando trabajamos con datos que ya están en formato de diccionario.

Procesando datos CSV

Una tarea común es leer un archivo CSV, procesar sus datos y escribir los resultados en otro archivo:

import csv

# Función para calcular un aumento de sueldo del 10%
def calcular_aumento(sueldo):
    return round(float(sueldo) * 1.1, 2)

# Abrimos el archivo de entrada y el de salida
with open('sueldos.csv', 'r', encoding='utf-8') as archivo_entrada, \
     open('sueldos_actualizados.csv', 'w', newline='', encoding='utf-8') as archivo_salida:
     
    # Preparamos el lector y el escritor
    lector = csv.DictReader(archivo_entrada)
    campos = lector.fieldnames + ['nuevo_sueldo']
    
    escritor = csv.DictWriter(archivo_salida, fieldnames=campos)
    escritor.writeheader()
    
    # Procesamos cada fila
    for fila in lector:
        # Calculamos el nuevo sueldo
        fila['nuevo_sueldo'] = calcular_aumento(fila['sueldo'])
        
        # Escribimos la fila actualizada
        escritor.writerow(fila)

Este ejemplo muestra un flujo completo:

  1. Leemos datos de un archivo CSV usando DictReader
  2. Procesamos cada fila, añadiendo un nuevo campo calculado
  3. Escribimos los resultados en un nuevo archivo CSV

Manejo de casos especiales

Valores con el delimitador

El módulo csv maneja automáticamente los valores que contienen el carácter delimitador. Por ejemplo, si un campo contiene una coma, será correctamente citado:

import csv

datos = [
    ['Nombre', 'Descripción'],
    ['Producto A', 'Plato grande, color azul'],
    ['Producto B', 'Vaso pequeño']
]

with open('productos.csv', 'w', newline='', encoding='utf-8') as archivo:
    escritor = csv.writer(archivo)
    escritor.writerows(datos)

El archivo resultante contendrá:

Nombre,Descripción
Producto A,"Plato grande, color azul"
Producto B,Vaso pequeño

Personalizando el formato

Puedes personalizar el comportamiento tanto de lectura como de escritura usando un objeto Dialect o especificando los parámetros directamente:

import csv

with open('datos_personalizados.csv', 'w', newline='', encoding='utf-8') as archivo:
    escritor = csv.writer(archivo,
                         delimiter=';',      # Usar punto y coma como separador
                         quotechar='"',      # Carácter para citar campos
                         quoting=csv.QUOTE_MINIMAL)  # Política de citado
    
    escritor.writerow(['Nombre', 'Dirección'])
    escritor.writerow(['Juan', 'Calle Mayor, 23'])

Resumen

Los archivos CSV son un formato esencial para el intercambio de datos y Python, a través de su módulo csv, proporciona herramientas robustas para trabajar con ellos. Hemos aprendido a leer archivos CSV tanto como listas simples como diccionarios, a escribir datos en este formato y a procesar información entre archivos.

Estas habilidades son fundamentales en el análisis de datos y se complementan perfectamente con bibliotecas más avanzadas como Pandas, que veremos en artículos posteriores. Con lo aprendido, ya puedes importar, procesar y exportar datos tabulares en tus programas Python, abriendo la puerta a aplicaciones más complejas como análisis estadísticos, visualización de datos o automatización de informes.