Supongamos que disponemos de un fichero llamado Datos.txt en el que están guardados los datos de un laboratorio desde las 8:00 de la mañana hasta las 20:00 horas de un día, los datos se toman a la hora en punto y a las medias de forma ininterrumpida. Los datos que se recogen son:
Hora en formato de horas y minutos como números enteros.
Presión atmosférica en milibares en forma de número entero sin decimales.
Temperatura en grados Celsius en forma de número con 1 decimal.
Humedad relativa en porcentaje en forma de un número con 2 decimales.
Número de personas que hay en el laboratorio.
Como ejemplo de un dato del fichero podría ser:
8;30;976;17.1;68.35;9
Partiendo de los datos del fichero anterior se quiere una aplicación informática que muestre:
¿Cuál ha sido la media de personas en el laboratorio?
¿Cuál ha sido el máximo número de personas en el laboratorio?
¿A qué hora se ha registrado el máximo número de personas en el laboratorio?
¿Cuál ha sido la temperatura más baja registrada en el laboratorio?
¿Cuál ha sido la temperatura media en el laboratorio?
Código "dado en el enunciado"
fichero=open("c:/tmp/datos041118.txt" ,"r")
totalpersonas=0
contador=0
máximodepersonas=0
totaltemperatura=0
for linea in fichero:
lista=linea.split(";")
hora=lista[0]
minuto=lista[1]
presión=lista[2]
temperatura=float(lista[3])
humedad=float(lista[4])
personas=int(lista[5])
totalpersonas+=float(personas)
if float(personas)>máximodepersonas:
máximodepersonas=float(personas)
horamáximodepersonas=hora + ":" + minuto
if contador==0:
mínimotemperatura=float(temperatura)
if float(temperatura)<mínimotemperatura:
mínimotemperatura=float(temperatura)
totaltemperatura+=float(temperatura)
contador+=1
print("Media de personas en el laboratorio: " + str(totalpersonas/contador))
print("Máximo número de personas en el laboratorio: " + str(máximodepersonas) + " a las " + str(horamáximodepersonas))
print("Temperatura más baja en el laboratorio: " + str(mínimotemperatura))
print("Media de temperatura en el laboratorio: " + str(totaltemperatura/contador))
fichero.close()
Se pide realizar un programa que:
Solicite el nombre de fichero. Seguidamente solicite los datos para grabar la información del tipo del ejemplo en el citado fichero.
Ejecutar el programa del ejemplo sobre el fichero que hemos grabado y observar si da los resultados correctos.
Modifica el programa del punto 1 para que pregunte al usuario si quiere crear un fichero de datos nuevo o añadir datos a uno existente. Asegurarse de que no borra por error uno existente y de que existe al que se quiere añadir. A continuación, vuelve a ejecutar el programa ejemplo y observe si los resultados obtenidos son correctos.
Resolver utilizando funciones.
Análisis:
En función de un menú el usuario elegirá una opción, validar las opciones.
Opción 1, pedir al usuario el nombre del archivo con el cuál va a trabajar, en caso de que existe, se le preguntará, si quiere sobrescribirlo o bien añadir.
Opción 2. Realizar los cálculos, con los datos del enunciado. O bien con el archivo generado en la opción 1.
Diagrama
Datos del archivo
Tomar en cuenta
Importar los modulos random y os
from random import randint, uniform
import os
Análisis de la opción 1. Introducir datos por tecleado
Pedir el nombre del archivo, y si existe (os.path.exists), que decida el usuario si quiere sobrescribirlo archivo=open(nombredelarchivo,a) o añadir los datos archivo=open(nombredelarchivo,w)
nombredelarchivo=pedir_nombre_archivo()
#SE verifica si existe el archivo , si existe quie quiere hacer el usuario, sobreescribirlo o añadir datos
if os.path.exists(nombredelarchivo):
bandera=True
while bandera:
#valisar lo que quier hacer el usuario
modo_abrir_archivo=input("Ese archivo existe, que quieres hacer?:\nS)Sobreescribirlo o\nA):Añade datos\n ").upper()
if modo_abrir_archivo in lista_modo_abrir_archivo:
bandera=False
else:
print("Tecleaste un modo incorrecto")
if modo_abrir_archivo=="S":
tipodeaperturadefichero="w"
else:
tipodeaperturadefichero="a"
else:
#No existe y por lo tanto se crea
tipodeaperturadefichero="w"
#Se abre el archivo
archivo=open(nombredelarchivo,tipodeaperturadefichero)
#Se introducen los datos
introducir_datos(archivo
Análisis del punto 2
Se le pregunta al usuario que quiere hacer, si utilizar el archivo original o el que él creo. Se verifica si existe el archivo os.path.exists(nombredelarchivo), en caso afirmativo, se realizan los cálculos con el código dado en el enunciado.
datos=""
lista_datos=["O", "P"]
#Se le pide al usuario si quiere ver el archivo original o trabajar con lo que ha creado
while datos not in lista_datos:
datos = input("O) Original )\nP) Propio archivo\n").upper()
print(datos)
if datos not in lista_datos:
print("Tecleaste un valor incorrecto")
print(opcion)
if datos=="P":
print("Pedir el archivo para realizar los cálculos")
nombredelarchivo=pedir_nombre_archivo()
else:
nombredelarchivo=archivo_ejemplo
#Si existe el archivo realizao los cálculos sino imprime el mensaje que no existe
if os.path.exists(nombredelarchivo):
original(nombredelarchivo)
else:
print("El archivo no existe")
Código Completo
from random import randint, uniform
import os
def Pedir_opcion():
lista_opcion=["A","B","S"]
opcion=""
while opcion not in lista_opcion:
opcion = input("A)Genera nuevo archivo\nB)Cálculo de datos con el propio archivo o el original \nS)Salir\nTeclea lo que quieres realizar: ").upper()
if opcion not in lista_opcion:
print("Tecleaste un valor incorrecto")
return opcion
def pedir_datos():
#Pedir los datos al usaurio.
# presion=float(input("Dame la presión"))
# temperatura=float(input("Dame la temperatura"))
# humedad=float(input("dame la humedad"))
# personas=int(input("dame el número de personas"))
#Que el sistema los genere
presion = randint(400,500)
temperatura =round(uniform(15,20),1)
humedad = round(uniform(40,50),2)
personas = randint(2,20)
return presion, temperatura,humedad, personas
def introducir_datos(nombredelarchivo ):
registro="{};{};{};{};{};{}\n"
for hora in range(8,21):
for minuto in [0,30]:
if not (hora==20 and minuto==30):
presion, temperatura,humedad, personas=pedir_datos()
#se genera un dato y se almacena hay dos maneras, resultado igual
nombredelarchivo.write(registro.format(hora,minuto,presion,temperatura,humedad,personas))
# nombredelarchivo.write(str(hora)+";"+str(minuto)+";"+str(presion)+";"+str(temperatura)+";"+str(humedad)+";"+str(personas)+"\n")
#cierra el archivo
nombredelarchivo.close()
def original(archivo_ejemplo):
#Se abre el archivo en modo lectura y se hacen los cálculos, datos originales
archivos = open(archivo_ejemplo,"r")
totalpersonas = 0
contador = 0
max_personas = 0
totaltemperatura = 0
conta_linea=0
for linea in archivos:
lineaData = linea.rstrip().split(";") # rstrip quita el \n que hay a la derecha
hora = lineaData[0]
minuto = lineaData[1]
presion = int(lineaData[2])
temperatura = float(lineaData[3])
humedad = float(lineaData[4])
personas = int(lineaData[5])
totalpersonas += personas
if personas > max_personas:
max_personas = personas
horamax_personas = hora + ":" + minuto
if contador == 0 or temperatura < mintemperatura:
mintemperatura = temperatura
totaltemperatura += temperatura
contador += 1
print("Media de personas en el laboratorio: " + str(round(totalpersonas/contador,2)))
print("Máximo número de personas en el laboratorio: " + str(int(max_personas)) + " a la hora " + str(horamax_personas))
print("Temperatura más baja en el laboratorio: " + str(mintemperatura))
print("Temperatura media en el laboratorio: " + str(round(totaltemperatura/contador,2)))
#Se cierra el archivo
archivos.close()
def pedir_nombre_archivo():
# Se piede el nombre del archivo y se la añade la extensión .txt
nombredelarchivo=input("Nombre del archivo a trabajar: ")
nombredelarchivo+=".txt"
return nombredelarchivo
#Nombre del archivo general
archivo_ejemplo="./datos041118.txt"
opcion=""
lista_modo_abrir_archivo=["S","A"]
while opcion != "s":
#Se solicta lo que quiere realizar el usuario
opcion=Pedir_opcion()
if opcion=="A":
nombredelarchivo=pedir_nombre_archivo()
#SE verifica si existe el archivo , si existe quie quiere hacer el usuario, sobreescribirlo o añadir datos
if os.path.exists(nombredelarchivo):
bandera=True
while bandera:
#valisar lo que quier hacer el usuario
modo_abrir_archivo=input("Ese archivo existe, que quieres hacer?:\nS)Sobreescribirlo o\nA):Añade datos\n ").upper()
if modo_abrir_archivo in lista_modo_abrir_archivo:
bandera=False
else:
print("Tecleaste un modo incorrecto")
if modo_abrir_archivo=="S":
tipodeaperturadefichero="w"
else:
tipodeaperturadefichero="a"
else:
#No existe y por lo tanto se crea
tipodeaperturadefichero="w"
#Se abre el archivo
archivo=open(nombredelarchivo,tipodeaperturadefichero)
#Se introducen los datos
introducir_datos(archivo)
elif opcion=="B":
datos=""
lista_datos=["O", "P"]
#Se le pide al usuario si quiere ver el archivo original o trabajar con lo que ha creado
while datos not in lista_datos:
datos = input("O) Original )\nP) Propio archivo\n").upper()
print(datos)
if datos not in lista_datos:
print("Tecleaste un valor incorrecto")
print(opcion)
if datos=="P":
print("Pedir el archivo para realizar los cálculos")
nombredelarchivo=pedir_nombre_archivo()
else:
nombredelarchivo=archivo_ejemplo
#Si existe el archivo realizao los cálculos sino imprime el mensaje que no existe
if os.path.exists(nombredelarchivo):
original(nombredelarchivo)
else:
print("El archivo no existe")
elif opcion=="S":
print("Fin de Programa")
else:
print("Tecleaste opción equivocada")