Dudas extracción de datos archivo CSV
Publicado por julio (1 intervención) el 29/06/2021 11:57:24
Se trata de un ejercicio por el cual debo de calcular la nota final de cada alumno. Esta se basa en un registro de nombre, apellido, control 1, control 2, examen final tal que así: (cada dato separado por comas)
Vicente,Vigalondo Mieses,8,5.25,7.5
Edwin,Casal Septiem,5.25,4,5
El error que me aparece es que no puedo comparar una cadena con un numero, pero no consigo realizar correctamente la conversión de la cadena a numero:
examen = [float(x) for x in examen]
ValueError: could not convert string to float: '.'
Vicente,Vigalondo Mieses,8,5.25,7.5
Edwin,Casal Septiem,5.25,4,5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
# Definimos la función que calcula la nota final de cada alumno, teniendo en cuenta los
# criterios de evaluación que se exponen en el ejercicio:
def calcula_nota_final(control1, control2, examen):
'''Esta función toma como parametros 3 notas de examen y calcula la
nota final según los criterios de evaluación. Si el examen final es mayor o
igual que 5, entonces se aplicará una regla; si es menor a 5, la nota final
será igual a la obtenida en el examen final.
'''
if examen >= 5:
aprobado = round(((control1) * 0.1) + ((control2) * 0.1) + ((examen) * 0.8), 2)
else:
suspenso = examen
# En segundo lugar, definimos la función que extrae datos del fichero, línea a línea:
def extrae_datos(linea):
'''Esta función devuelve cada uno de los valores que lee en cada linea
y elimina el caracter que separa a cada dato en el archivo CSV. Además,
debe devolver las 3 notas de cada alumno en formato de numero
'''
# Con esto rompemos la cadena de texto y desagregamos los datos
elementos = linea.split(',')
# Extraemos los datos de cada línea:
nombre = elementos[0]
apellidos = elementos[1]
control1 = elementos[2]
control2 = elementos[3]
examen = elementos[4]
examen = [float(x) for x in examen]
return nombre, apellidos, control1, control2, examen
# Una vez hemos comprobado que las dos funciones anteriores funcionan correctamente, nos dispondremos
# a fabricar la última función. El mecanismo de esta función será el siguiente: toma como parámetro el nombre
# del archivo CSV y haciendo uso de las dos funciones auxiliares anteriores, escribirá en la consola
# el aprobado o no de cada alumno y su correspondiente nota final redondeada.
def calcula_notas_finales(nombre_fichero):
'''Lee los datos de cada linea del fichero de notas de CSV e
imprime en la consola la nota final de cada uno de los alumnos.
En caso de que suspendan, también lo especificará.
'''
# A continuación abrimos el fichero en modo lectura:
with open(nombre_fichero, encoding= 'utf-8') as f:
for linea in f:
# invocamos a extrae_datos para conseguir la info de cada alumno
nombre, apellidos, control1, control2, examen = extrae_datos(linea)
# invocamos a calcula_nota_final para obtener la calificación final
control1, control2, examen = calcula_nota_final(control1, control2, examen)
if examen >= 5:
print(nombre, apellidos, calcula_nota_final(linea), 'aprobado')
else:
print(nombre, apellidos, calcula_nota_final(linea), 'suspenso')
calcula_notas_finales('notas.csv')
El error que me aparece es que no puedo comparar una cadena con un numero, pero no consigo realizar correctamente la conversión de la cadena a numero:
examen = [float(x) for x in examen]
ValueError: could not convert string to float: '.'
Valora esta pregunta


0