Lección 10 · 03 Datos del mundo real

CSV: hojas de cálculo con Python

Lo que exportas de Excel, de tu CRM o de tu banco suele llegar como CSV. Con Python lo lees, lo filtras y lo resumes en segundos.

Leer con DictReader

Un CSV es texto: una fila por línea y columnas separadas por comas. csv.DictReader usa la primera fila como cabecera y te da cada fila como un diccionario:

import csv, io

datos = """cliente,importe,estado
Acme,120,pagada
Globex,80,pendiente
Initech,300,pagada"""

for fila in csv.DictReader(io.StringIO(datos)):
    print(fila["cliente"], fila["importe"])

io.StringIO hace que un texto se comporte como un fichero. Con un fichero real escribirías open("ventas.csv", encoding="utf-8") en su lugar; el resto es igual.

Todo lo que lee un CSV es texto: "120", no 120. Convierte con int() o float() antes de sumar.

Separadores y decimales españoles

Excel en español suele exportar con punto y coma y coma decimal:

import csv, io

datos = "producto;precio\nCafé;1,50\nTé;1,20"
for fila in csv.DictReader(io.StringIO(datos), delimiter=";"):
    precio = float(fila["precio"].replace(",", "."))
    print(fila["producto"], precio)

Escribir un CSV

import csv, io

salida = io.StringIO()
escritor = csv.writer(salida)
escritor.writerow(["cliente", "total"])
escritor.writerow(["Acme", 165])
print(salida.getvalue())
// reto 01

Total facturado

Suma en total la columna importe de todas las filas (como número) e imprímelo.

main.py
Ctrl/⌘ + Enter
¿Atascado? Ver pista

Recorre csv.DictReader(io.StringIO(datos)) y suma float(fila["importe"]).

$ python main.py
    // reto 02

    Solo los pendientes

    Guarda en deudores la lista de clientes cuyo estado es pendiente, en el orden en que aparecen. Imprímela.

    main.py
    Ctrl/⌘ + Enter
    ¿Atascado? Ver pista

    Ojo con el separador: este CSV usa ;, así que necesitas csv.DictReader(io.StringIO(datos), delimiter=";").

    $ python main.py
      // reto 03

      Informe por estado

      Crea el diccionario por_estado con el importe total de cada estado ({"pagada": ..., "pendiente": ...}) usando los datos del reto anterior. Imprímelo.

      main.py
      Ctrl/⌘ + Enter
      ¿Atascado? Ver pista

      Igual que contar, pero sumando importes: por_estado[e] = por_estado.get(e, 0) + int(fila["importe"]).

      $ python main.py