Lección 28 de 48 · Errores y archivos

Lee filas y columnas de un CSV

Leer una tabla CSV y convertir una columna antes de calcular.

Ruta esencialAvanza a tu ritmo
Índice · Lección 28/48
Al terminar podrás…

leer una tabla CSV y convertir una columna antes de calcular.

Entiende la idea

CSV representa una tabla en texto. Cada línea contiene una fila y los valores se separan por un delimitador, normalmente una coma. La cabecera nombra las columnas. Encaja con ventas o mediciones que comparten las mismas columnas; JSON resulta más natural para datos con niveles anidados.

csv.DictReader utiliza la cabecera para entregar cada fila como un diccionario. Así puedes consultar fila["importe"] por su nombre. La cabecera describe las claves, no una fila de datos que haya que sumar.

Una celda es el dato de una fila y una columna. Las celdas que lee DictReader llegan como texto. Aunque una columna contenga 12 y 20, primero recibes "12" y "20". Convierte el importe con int o float antes de acumularlo. Decide también qué unidad representa: euros y céntimos no se pueden mezclar sin convertir.

La biblioteca csv se ocupa del formato, incluidas celdas con separadores entre comillas. No separes las líneas a mano con split si quieres un lector que respete esas reglas.

Lee una tabla pequeña

Programa completo
import csv
from io import StringIO

texto = "producto,importe\nLibro,12\nJuego,20\n"
filas = list(csv.DictReader(StringIO(texto)))
total = 0
for fila in filas:
    total = total + int(fila["importe"])
print(len(filas))
print(total)
Salida del programa
2
32

StringIO ofrece el texto al lector como si fuera un archivo; esas líneas proporcionadas permiten practicar sin preparar una descarga. list reúne las filas para consultarlas más de una vez.

total = 0 prepara una suma que se va actualizando: es un acumulador. La primera vuelta convierte "12" y actualiza total de 0 a 12. La segunda convierte "20" y lo deja en 32. La cabecera no cuenta como venta; len(filas) vale 2.

Un archivo real puede abrirse con open("ventas.csv", newline="", encoding="utf-8") y pasarse a DictReader. newline="" permite al lector gestionar los finales de línea. Es el mismo recorrido después de obtener las filas.

Practica con ayuda

El lector ya prepara las filas. Completa solo la transformación y la acumulación. No cambies el texto para conseguir 32: la misma operación debe funcionar con otras ventas.

Suma una columna CSV

El lector y los datos iniciales ya están preparados: consérvalos. Dentro del for, convierte fila["importe"] a int y suma ese número al total anterior. No escribas 32 directamente: la suma debe servir con otras filas. También puedes usar otra forma equivalente de sumar los importes.

Salida esperada
2
32
Qué se comprueba
  • las columnas contienen texto antes de convertir
  • 12 + 20
  • otros importes CSV suman 7

Al ejecutar verás los casos que necesitan revisión. No hay requisitos adicionales fuera del enunciado.

analizar_csv.py

Usa 4 espacios de sangría al empezar una línea dentro de un bloque. Ctrl + Intro (⌘ + Intro en Mac) ejecuta. Tab pasa al siguiente control. Tu borrador se guarda en este navegador; Restablecer recupera el código inicial.

La salida aparecerá aquí.

    Pista 1 · dónde mirar

    StringIO permite leer texto como si fuera un archivo. DictReader usa la cabecera para nombrar las columnas.

    Pista 2 · qué idea usar

    Convierte fila["importe"] con int y suma el resultado al total anterior.

    Pista 3 · un paso posible

    Un paso de la solución: total = total + importe. Usa la explicación para colocarlo donde corresponde.

    Ver una solución razonada

    El CSV entrega "12" y "20" como texto. Convertir cada importe antes de acumular produce 32. Un for con pasos visibles evita introducir expresiones generadoras antes de estudiarlas.

    import csv
    from io import StringIO
    
    texto = "producto,importe\nLibro,12\nJuego,20\n"
    filas = list(csv.DictReader(StringIO(texto)))
    total = 0
    for fila in filas:
        importe = int(fila["importe"])
        total = total + importe
    print(len(filas))
    print(total)

    Inténtalo tú

    ¿Una celda "12" sale de DictReader como int o como str?

    Comprobar y entender el porqué

    str. El lector conserva el texto de la celda. Convertirlo en un número es una decisión del programa que conoce el significado de la columna.

    Qué debes recordar

    • La cabecera da nombre a las columnas.
    • DictReader entrega una fila como diccionario.
    • Las celdas llegan como texto.
    • Convierte y comprueba la unidad antes de sumar.