65 lines
1.6 KiB
Python
65 lines
1.6 KiB
Python
from os import strerror
|
|
|
|
|
|
class StudentsDataException(Exception):
|
|
pass
|
|
|
|
|
|
class BadLine(StudentsDataException):
|
|
def __init__(self, line_number, line):
|
|
message = "Riga " + str(line_number) + ": " + line.rstrip()
|
|
super().__init__(message)
|
|
|
|
|
|
class FileEmpty(StudentsDataException):
|
|
def __init__(self):
|
|
super().__init__("il file esiste, ma e' vuoto")
|
|
|
|
|
|
file_name = input("Inserisci il nome del file del Prof. Jekyll: ")
|
|
students = {}
|
|
|
|
try:
|
|
stream = open(file_name, "rt", encoding="utf-8")
|
|
lines = stream.readlines()
|
|
stream.close()
|
|
|
|
if len(lines) == 0:
|
|
raise FileEmpty()
|
|
|
|
for line_number, line in enumerate(lines, 1):
|
|
parts = line.split()
|
|
|
|
# Ogni riga deve avere esattamente: nome, cognome, punti.
|
|
if len(parts) != 3:
|
|
raise BadLine(line_number, line)
|
|
|
|
first_name = parts[0]
|
|
last_name = parts[1]
|
|
|
|
try:
|
|
# Accettiamo sia il punto sia la virgola come separatore decimale.
|
|
points = float(parts[2].replace(",", "."))
|
|
except ValueError:
|
|
raise BadLine(line_number, line)
|
|
|
|
student = first_name + " " + last_name
|
|
|
|
if student in students:
|
|
students[student] += points
|
|
else:
|
|
students[student] = points
|
|
|
|
if len(students) == 0:
|
|
raise FileEmpty()
|
|
|
|
for student in sorted(students.keys()):
|
|
print(student, students[student])
|
|
|
|
except FileEmpty as e:
|
|
print("Errore:", e)
|
|
except BadLine as e:
|
|
print("Errore nei dati di input:", e)
|
|
except IOError as e:
|
|
print("Errore di I/O:", strerror(e.errno))
|