Cómo leer un archivo CSV en Python

Hay dos buenas respuestas: el módulo integrado csv, sin dependencias, o pandas, si vas a analizar los datos. Aquí tienes ambas y los errores que de verdad aparecen.

🎙️ Publicado y grabado:

🎧 Escuchar esta guía

Sin dependencias: csv.DictReader (normalmente, lo que buscas)

Cada fila llega como un diccionario cuyas claves salen de la cabecera: código legible y nada de contar índices.

import csv

with open("users.csv", newline="", encoding="utf-8") as f:
    for row in csv.DictReader(f):
        print(row["name"], row["email"])

# row = {"name": "Ada", "email": "[email protected]", ...} en cada línea
# los valores SIEMPRE son cadenas: convierte tú mismo los números:
        total += float(row["amount"])

¿El archivo no tiene cabecera? reader y patrones para saltar filas

with open("data.csv", newline="", encoding="utf-8") as f:
    reader = csv.reader(f)          # filas como listas simples
    next(reader)                    # ← omite la cabecera si hace falta
    for row in reader:
        print(row[0], row[2])

Con pandas (para analizar)

import pandas as pd

df = pd.read_csv("users.csv")
df.head()                          # muestra las primeras 5 filas
df["amount"].sum()                # las columnas ya vienen tipadas

# opciones habituales:
pd.read_csv("f.csv", sep=";")              # archivos con punto y coma (¡Europa!)
pd.read_csv("f.csv", skiprows=2)           # líneas sobrantes antes de la cabecera
pd.read_csv("f.csv", usecols=["name","amount"])  # solo algunas columnas

¿Cuál elegir? Si lees filas para pasarlas a tu programa, usa el módulo csv y no instales nada. Si vas a filtrar, agrupar o hacer cálculos con columnas, pandas se gana sus 100 MB.

Volver a escribir un CSV

rows = [{"name": "Ada", "score": 95}, {"name": "Lin", "score": 88}]

with open("out.csv", "w", newline="", encoding="utf-8") as f:
    w = csv.DictWriter(f, fieldnames=["name", "score"])
    w.writeheader()
    w.writerows(rows)
Te va a pasar esto (en Windows)
UnicodeDecodeError: 'charmap' codec can't decode byte 0x9d: es un archivo UTF-8 abierto sin encoding="utf-8". Además, algunos archivos exportados por Excel requieren encoding="utf-8-sig". El BOM invisible convierte el nombre de la primera columna en "name"; si row["name"] lanza un KeyError inexplicable, esa es la causa. Y si aparecen líneas en blanco entre filas en Windows, olvidaste newline="" en open().
No lo hagas a mano
line.split(",") funciona hasta que el primer valor contiene una coma, por ejemplo "Smith, John",42. Entonces corrompe tus datos en silencio. Los campos entre comillas son justo la razón por la que existe el módulo csv. Nunca analices un CSV real separándolo a mano.
📚 Esta es una página de nuestra serie de Python. Curso intensivo completo, con audio para el trayecto: Python en 10 minutos →