Cómo leer un archivo CSV en Python paso a paso
Leer archivos CSV es una de las tareas más frecuentes en Python. Desde analizar ventas hasta procesar respuestas de formularios, casi cualquier dato del mundo real llega en formato CSV. La buena noticia: Python incluye el módulo csv en la biblioteca estándar, y con pandas puedes hacerlo en una sola línea. En esta guía verás ambas formas, cuándo usar cada una y cómo evitar los errores más típicos.
Leer un CSV con el módulo csv (sin instalar nada)
El módulo csv viene incluido en Python. Es la opción correcta cuando no quieres dependencias externas o el archivo es pequeño.
import csv
with open("ventas.csv", newline="", encoding="utf-8") as archivo:
lector = csv.reader(archivo)
for fila in lector:
print(fila) # ['Ana', '1200', 'Madrid']
Para acceder por nombre de columna en lugar de por índice, usa DictReader:
import csv
with open("ventas.csv", newline="", encoding="utf-8") as archivo:
lector = csv.DictReader(archivo)
for fila in lector:
print(fila["nombre"], fila["ventas"]) # Ana 1200
Leer un CSV con pandas (la forma más rápida)
pandas es la librería estándar para análisis de datos en Python. Si ya la tienes instalada (pip install pandas), leer un CSV es una sola línea:
import pandas as pd
df = pd.read_csv("ventas.csv")
print(df.head()) # primeras 5 filas
print(df.shape) # (100, 3) → 100 filas, 3 columnas
print(df["ventas"].sum()) # suma de la columna ventas
pandas infiere automáticamente los tipos de cada columna y gestiona valores vacíos. Para archivos grandes o cuando necesitas filtrar, ordenar o calcular, pandas es siempre la mejor opción.
Casos de uso reales
Filtrar filas por condición:
import pandas as pd
df = pd.read_csv("ventas.csv")
madrid = df[df["ciudad"] == "Madrid"]
print(madrid) # solo las filas donde ciudad es Madrid
Calcular totales por categoría:
resumen = df.groupby("ciudad")["ventas"].sum()
print(resumen)
# Madrid 4500
# Barcelona 3200
# Valencia 1800
Guardar el resultado en un CSV nuevo:
resumen.to_csv("resumen_por_ciudad.csv")
# Crea el archivo con las ciudades y sus totales
Errores comunes
Error: el archivo no se encuentra
# ❌ Incorrecto
with open("ventas.csv") as f: # falla si no estás en el directorio correcto
pass
Solución:
# ✅ Correcto
import os
ruta = os.path.join(os.path.dirname(__file__), "ventas.csv")
with open(ruta, newline="", encoding="utf-8") as f:
pass
Error: caracteres extraños en el texto (tildes, ñ)
# ❌ Incorrecto
with open("ventas.csv") as f: # encoding por defecto puede no ser UTF-8
pass
Solución:
# ✅ Correcto
with open("ventas.csv", newline="", encoding="utf-8") as f:
pass
# Si el archivo viene de Excel en Windows, prueba encoding="latin-1"
Error: las columnas numéricas se leen como texto con csv.reader
# ❌ Problema
fila = ["Ana", "1200"]
total = fila[1] + 500 # TypeError: can only concatenate str to str
Solución:
# ✅ Correcto
total = int(fila[1]) + 500 # 1700
# Con pandas esto no ocurre — infiere el tipo automáticamente
💡 Practica esto en PythonLingo: Refuerza lo que acabas de leer con los ejercicios interactivos de Listas en Python
¿Listo para ir más lejos? Empieza gratis en PythonLingo — ejercicios interactivos, retos diarios y sin instalar nada.
Preguntas frecuentes
¿Necesito instalar algo para leer CSV en Python?
No. El módulo csv viene incluido en Python y no requiere instalación. Si quieres funcionalidades avanzadas como filtrar o calcular, entonces sí necesitas instalar pandas con pip install pandas.
¿Qué diferencia hay entre csv.reader y csv.DictReader?
csv.reader devuelve cada fila como una lista donde accedes por índice: fila[0], fila[1]. csv.DictReader devuelve cada fila como un diccionario donde accedes por nombre de columna: fila['nombre']. DictReader es más legible cuando el CSV tiene cabeceras.
¿Por qué aparecen caracteres extraños al leer un CSV?
El problema es el encoding. La mayoría de archivos modernos usan UTF-8, pero los archivos generados por Excel en Windows suelen usar latin-1 o cp1252. Prueba añadiendo encoding='utf-8' y si sigue fallando cambia a encoding='latin-1'.
¿Puedo leer un CSV desde una URL sin descargarlo?
Sí, con pandas directamente: pd.read_csv('https://ejemplo.com/datos.csv'). pandas descarga y parsea el archivo en una sola línea. Con el módulo csv necesitarías primero descargar el archivo con urllib o requests.
¿Listo para practicar? 🐍
Pon en práctica lo que aprendiste con ejercicios interactivos.