Random maths quiz with sorting
You should really use more functions,
for a little more to type def fn_name and fn_name() you can get way more readability.
You can also get quite a significant speed up.

For example the code to pick a class name can be wrapped in one.

def pick_class_name():
    classname = ""
    while True:
        classpick = input("Enter class name (\"A,B,C\") ").upper()
        try:
            if classpick in ["A","B","C"]:
                classname = "class"+classpick+".txt"
                break
            else:
                raise ValueError
        except ValueError:
            print("Invalid value. Please enter a letter A,B or C.")
            break

    return classname


This can be improved quite significantly.
The only time that the try will raise a ValueError is when you explicitly raise ValueError.
This basically means that your except should be your else.

def pick_class_name():
    classname = ""
    while True:
        classpick = input("Enter class name (\"A,B,C\") ").upper()
        if classpick in ["A","B","C"]:
            classname = "class"+classpick+".txt"
            break
        else:
            print("Invalid value. Please enter a letter A,B or C.")
            break

    return classname


The above clearly shows the while True is pointless, along with all the breaks.
Instead you could remove the break on the else and change the class_name = into a return.

def pick_class_name():
    while True:
        classpick = input("Enter class name (\"A,B,C\") ").upper()
        if classpick in ["A","B","C"]:
            return "class" + classpick + ".txt"
        else:
            print("Invalid value. Please enter a letter A,B or C.")


You do these try: if: ... else: raise: except: blocks rather than just a simple if ... else,
in a few places, mostly in while loops, that can probably be changed like the above.



You use test in a for loop but rely on the global i to output the correct question number.
This is just bad, first for i in ... is only good if you use that i in a small loop like:

def test(question_number):
    #...
    # Use `question_number` rather than `i`

for i in range(10):
    test(i)


This is as tracking global and local one letter variable names is hard and annoying.
Even more so if you are using an idiom unidiomatically.
So you would want to use question_number rather than i in this case.
You however don't want to change i to question_number in the loop,
as you'll still have to remember global variable.

This would also allow you to change that block of code into a one-liner:

correct_count = sum(map(test, range(question_count)))
correct_count = sum(test(i) for i in range(question_count))


Where if you used the first one in your current code you will get an error or the question number won't change.
And so it's prone to breaking your function depending on how it's used.



Your code is quite hard to read, as you rely on global variables in your functions, and you don't have many functions.
To both make it more efficient and easier to read you should add more functions.