Ejercicio 3

El fichero horas-trabajo.csv contiene el número de horas mensuales trabajadas por los empleados de una empresa durante el primer cuatrimestre. Crear un programa que realice las siguientes operaciones sin utilizar la librería Pandas:

  1. Leer el fichero de internet http://aprendeconalf.es/python/examenes/soluciones/examen-2020-05-27/horas-trabajo.csv y crear una lista con las líneas del fichero.
  2. Mostrar por pantalla las horas totales del primer operario.
  3. Crear un diccionario de diccionarios tal que las claves del diccionario principal serán los identificadores de los operarios y sus valores serán, a su vez, otros diccionarios cuyas claves serán los meses y sus valores las horas trabajadas en esos meses para cada operario. Es decir, un diccionario como el siguiente: {'OP1': {'Enero': '180', 'Febrero': '160', 'Marzo': '140', 'Abril': '180'}, 'OP2': {'Enero': '120', 'Febrero': '140', 'Marzo': '', 'Abril': '100'}, ... }
  4. Crear una función que reciba la base de datos de las horas trabajadas (puede utilizarse el diccionario del apartado anterior u otra estructura de datos), el identificador de un operario y el precio de la hora, y devuelva una tupla con el número totales de horas trabajadas y el salario de ese operario.

Solución 1


In [2]:
# Apartado 1
from urllib import request
from urllib.error import URLError
# Leemos el fichero desde la url.
try:
    f = request.urlopen('http://aprendeconalf.es/python/examenes/soluciones/examen-2020-05-27/horas-trabajo.csv')
    # El fichero no existe
except URLError:
    print('¡La url no existe!')
else:
    # Guardamos cada línea en una lista
    lineas = f.read().decode('utf-8').splitlines()
    print("Lista de líneas del fichero")
    print(lineas)


Lista de líneas del fichero
['Id;Departamento;Enero;Febrero;Marzo;Abril', 'OP1;Proveedores;180;160;140;180', 'OP2;Ventas;120;140;;100', 'OP3;Ventas;80;90;80;80', 'OP5;IT;180;170;180;180', 'OP6;Marketing;100;;100;', 'OP7;Ventas;160;160;160;160', 'OP8;Proveedores;100;80;110;80', 'OP9;IT;80;80;80;80', 'OP10;Ventas;180;160;180;180']

In [3]:
# Apartado 2
# Mostrar por pantalla las horas totales del primer operario.
# Dividimo la segunda línea de la lista por el separador ; y guardamos cada campo en una lista.
op1 = lineas[1].split(';')
# Recorremos la lista desde la posición 2 hasta el final, convertimos las horas en enteros y creamos una lista con las horas.
horas_op1 = [int(i) for i in op1[2:]]
# Sumamos las horas de la lista.
print('Horas totales del primer operario:', sum(horas_op1))


Horas totales del primer operario: 660

In [4]:
# Apartado 3
# Crear un diccionario de diccionarios tal que las claves del diccionario principal serán los identificadores de los operarios y sus valores serán, a su vez, otros diccionarios cuyas claves serán los meses y sus valores las horas trabajadas en esos meses para cada operario.
# Extraemos los nombres de columnas de la primera fila
columnas = lineas[0].split(';')
# Creamos el diccionario para guardar las horas de cada operario
operarios = {}
# Recorremos las líneas del fichero desde la primera hasta el final
for linea in lineas[1:]:
  # Creamos un diccionario para guardar las horas mensuales de cada operario
  operario = {}
  # Dividimos las línea en campos utilizando la coma como separador
  campos = linea.split(';')
  # Recorremos la lista de campos desde el tercer campo hasta el final (los dos primeros campos no contienen horas)
  for i in range(2, len(campos)):
    # Añadimos al diccionario las horas de cada mes
    operario[columnas[i]] = campos[i]
  # Añadimos el diccionario con las horas de un operario al diccionario de operarios
  operarios[campos[0]] = operario
print('Diccionario de diccionaros con las horas mensuales de cada operario')
print(operarios)


Diccionario de diccionaros con las horas mensuales de cada operario
{'OP1': {'Enero': '180', 'Febrero': '160', 'Marzo': '140', 'Abril': '180'}, 'OP2': {'Enero': '120', 'Febrero': '140', 'Marzo': '', 'Abril': '100'}, 'OP3': {'Enero': '80', 'Febrero': '90', 'Marzo': '80', 'Abril': '80'}, 'OP5': {'Enero': '180', 'Febrero': '170', 'Marzo': '180', 'Abril': '180'}, 'OP6': {'Enero': '100', 'Febrero': '', 'Marzo': '100', 'Abril': ''}, 'OP7': {'Enero': '160', 'Febrero': '160', 'Marzo': '160', 'Abril': '160'}, 'OP8': {'Enero': '100', 'Febrero': '80', 'Marzo': '110', 'Abril': '80'}, 'OP9': {'Enero': '80', 'Febrero': '80', 'Marzo': '80', 'Abril': '80'}, 'OP10': {'Enero': '180', 'Febrero': '160', 'Marzo': '180', 'Abril': '180'}}

In [5]:
# Apartado 4
# Crear una función que reciba la base de datos de las horas trabajadas (puede utilizarse el diccionario del apartado anterior u otra estructura de datos), el identificador de un operario y el precio de la hora, y devuelva una tupla con el número totales de horas trabajadas y el salario de ese operario. 
def salario(horas, operario, precio):
    ''' Función que recibe un diccionario de diccionarios con las horas mensuales trabajadas por los operarios de la empresa y devuelve el salario de un operario dado.

    Parámetrso:
        - horas: Es un diccionari de diccionarios con las horas mensuales de cada operario.
        - operario: Es una cadena con el identificador del operario.
        - precio: Es un número real con el precio de la hora.
    Devuelve: El salario del opeario dado.
    '''        
    # Creamos una lista con las horas correspondientes al operario. Las horas se convierten a enteros salvo si no hay horas. 
    horas = [int(i) for i in horas[operario].values() if i != '']
    # Sumamos el total de horas
    total_horas = sum(horas)
    # Calculamos el salario multiplicando el total de horas por el precio.
    salario = total_horas * precio
    return total_horas, salario

# Ejemplo operario 2
horas, salario = salario(operarios, 'OP2', 10)
print('Horas trabajadas del segundo operario:', horas)
print('Salario del segundo operario:', salario)


Horas trabajadas del segundo operario: 360
Salario del segundo operario: 3600

In [ ]: