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:
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.
Los datos son los que se pueden ver en este enlace. Los dejé por separado porque harían muy largo el post.
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.
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.
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.
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.
Ya te enseñé cómo convertir una aplicación web de Vue 3 en una PWA. Al…
En este artículo voy a documentar la arquitectura que yo utilizo al trabajar con WebAssembly…
En un artículo anterior te enseñé a crear un PWA. Al final, cualquier aplicación que…
Al usar Comlink para trabajar con los workers usando JavaScript me han aparecido algunos errores…
En este artículo te voy a enseñar cómo usar un "top level await" esperando a…
Ayer estaba editando unos archivos que son servidos con el servidor Apache y al visitarlos…
Esta web usa cookies.