Hoy vamos a resolver un ejercicio con Python en donde vamos a trabajar con diccionarios, archivos CSV y métodos de ordenamiento.
El ejercicio en cuestión dice así:
Se dispone de un CSV con información fiscal de una empresa en diferentes años. Dicha información corresponde a la facturación de la empresa por cada uno de los trimestres.
Se pide escribir en Python que:
- Permita acceder a los datos de manera automatizada leyendo cada año y obtener la media de la facturación anual.
- Permita escribir en un documento txt cada una de la información obtenida del apartado anterior escribiéndolo cronológicamente de mas antiguo a mas moderno.
Explicación del algoritmo
Entonces tenemos que leer el CSV y cargarlo a una lista.
Cada elemento de la lista será una fila del CSV pero ya interpretado, así que antes de agregarlo a la lista con append vamos a separarlo con split y convertir sus valores numéricos a floantes y enteros.
Luego de eso ya tendremos una lista con los datos del CSV.
A esta lista ya la podemos recorrer y calcular la media (son 4 trimestres, se suman y se dividen entre 4), además de que ya se puede ordenar o escribir en un archivo.
Datos para ejercicio
Los datos son los que se pueden ver en este enlace. Los dejé por separado porque harían muy largo el post.
Leyendo lista de facturación
Comencemos viendo cómo convertir el CSV a lista. Queda así:
def obtener_lista_facturacion():
lista = []
with open(NOMBRE_ARCHIVO) as archivo:
next(archivo)
for linea in archivo:
datos_separados = linea.split(";")
año = int(datos_separados[0])
trimestre1 = float(datos_separados[1])
trimestre2 = float(datos_separados[2])
trimestre3 = float(datos_separados[3])
trimestre4 = float(datos_separados[4])
lista.append({
"año": año,
"trimestre1": trimestre1,
"trimestre2": trimestre2,
"trimestre3": trimestre3,
"trimestre4": trimestre4,
})
return lista
Por cierto, en la línea 4 estamos omitiendo el encabezado del archivo.
Imprimir media o promedio
Ahora que ya tenemos el CSV como una lista de Python podemos calcular la media, que es la suma de los elementos entre la cantidad de los mismos.
El código queda así:
def imprimir_años_con_media():
lista = obtener_lista_facturacion()
for elemento in lista:
año = elemento["año"]
media = (elemento["trimestre1"] + elemento["trimestre2"] +
elemento["trimestre3"] + elemento["trimestre4"]) / 4
print(f"Año {año} facturación media de {media} euros")
Simplemente invocamos a la lista anterior y la recorremos. Luego calculamos la media en la línea 5 y la imprimimos en la línea 7.
Escribir facturación total por año cronológicamente
Ahora veamos el último punto de este ejercicio en Python. Debemos obtener la facturación total del año, ordenarla por año de manera descendente y luego escribirla en un archivo.
En este caso usaré el método de la burbuja para el ordenamiento, pero se podría usar cualquiera de los que aparecen en mi otro post.
Una vez que la lista está ordenada, la escribimos en un archivo.
def burbuja(arreglo):
longitud = len(arreglo)
for i in range(longitud):
for indice_actual in range(longitud - 1):
indice_siguiente_elemento = indice_actual + 1
if arreglo[indice_actual]["año"] < arreglo[indice_siguiente_elemento]["año"]:
arreglo[indice_siguiente_elemento], arreglo[indice_actual] = arreglo[indice_actual], arreglo[indice_siguiente_elemento]
def guardar_años_cronologicamente():
lista = obtener_lista_facturacion()
burbuja(lista)
with open(NOMBRE_ARCHIVO_ESCRITURA, "w", encoding="utf-8") as archivo:
for elemento in lista:
año = elemento["año"]
total = (elemento["trimestre1"] + elemento["trimestre2"] +
elemento["trimestre3"] + elemento["trimestre4"])
archivo.write(f"Año {año} facturación anual de: {total} euros.\n")
Toma en cuenta que en este caso estamos escribiendo la facturación anual total, y para el caso anterior era la media de los 4 trimestres.
Poniendo todo junto
El código completo queda como se ve a continuación. Recuerda que necesitas el archivo CSV en la misma ubicación que el script de Python para que esto funcione.
# https://parzibyte.me/blog
NOMBRE_ARCHIVO = "datos.csv"
NOMBRE_ARCHIVO_ESCRITURA = "documento.txt"
def obtener_lista_facturacion():
lista = []
with open(NOMBRE_ARCHIVO) as archivo:
next(archivo)
for linea in archivo:
datos_separados = linea.split(";")
año = int(datos_separados[0])
trimestre1 = float(datos_separados[1])
trimestre2 = float(datos_separados[2])
trimestre3 = float(datos_separados[3])
trimestre4 = float(datos_separados[4])
lista.append({
"año": año,
"trimestre1": trimestre1,
"trimestre2": trimestre2,
"trimestre3": trimestre3,
"trimestre4": trimestre4,
})
return lista
def imprimir_años_con_media():
lista = obtener_lista_facturacion()
for elemento in lista:
año = elemento["año"]
media = (elemento["trimestre1"] + elemento["trimestre2"] +
elemento["trimestre3"] + elemento["trimestre4"]) / 4
print(f"Año {año} facturación media de {media} euros")
def burbuja(arreglo):
longitud = len(arreglo)
for i in range(longitud):
for indice_actual in range(longitud - 1):
indice_siguiente_elemento = indice_actual + 1
if arreglo[indice_actual]["año"] < arreglo[indice_siguiente_elemento]["año"]:
arreglo[indice_siguiente_elemento], arreglo[indice_actual] = arreglo[indice_actual], arreglo[indice_siguiente_elemento]
def guardar_años_cronologicamente():
lista = obtener_lista_facturacion()
burbuja(lista)
with open(NOMBRE_ARCHIVO_ESCRITURA, "w", encoding="utf-8") as archivo:
for elemento in lista:
año = elemento["año"]
total = (elemento["trimestre1"] + elemento["trimestre2"] +
elemento["trimestre3"] + elemento["trimestre4"])
archivo.write(f"Año {año} facturación anual de: {total} euros.\n")
def main():
opciones = "1. Imprimir años con media\n2. Guardar años cronológicamente\n3. Salir\nElige: "
eleccion = ""
while eleccion != "3":
eleccion = input(opciones)
if eleccion == "1":
imprimir_años_con_media()
elif eleccion == "2":
guardar_años_cronologicamente()
main()
Te dejo más ejercicios de Python en mi blog en caso de que quieras aprender más sobre este maravilloso lenguaje.