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))
