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.
"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())Total facturado
Suma en total la columna importe de todas las filas (como número) e imprímelo.
¿Atascado? Ver pista
Recorre csv.DictReader(io.StringIO(datos)) y suma float(fila["importe"]).
Solo los pendientes
Guarda en deudores la lista de clientes cuyo estado es pendiente, en el orden en que aparecen. Imprímela.
¿Atascado? Ver pista
Ojo con el separador: este CSV usa ;, así que necesitas csv.DictReader(io.StringIO(datos), delimiter=";").
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.
¿Atascado? Ver pista
Igual que contar, pero sumando importes: por_estado[e] = por_estado.get(e, 0) + int(fila["importe"]).