Project Euler # 22 names scores in Python
The code looks quite good in general. Without a deeper look at the problem, there are twothree things that can easily be improved:

Building the look-up table

You use

letter_scores = {letter: ord(letter) - 64 for letter in string.ascii_uppercase}


which makes use of the ASCII encoding to determine the value of each letter. The following could be considered a little bit more straightforward:

letter_scores = {letter: index for index, letter in enumerate(string.ascii_uppercase, 1)}


This uses enumerate with a starting value of 1 to assign the position in the alphabet.

Iterating over the sorted names

When iterating over the sorted names, you already use enumerate to get index, but since you only use index+1, you can reuse the trick from above to simplify this even further (as @RootTwo rightfully pointed out in his comment).

Computing the score

To compute the score you use a for loop with an intermediate variable:

temp = 0
for letter in name:
    temp += letter_scores[letter]
total += temp * (index + 1)


This can be rewritten using a generator expression and sum:

total += sum(letter_scores[letter] for letter in name) * (index + 1)


It basically allows you to get rid of the additional counter variable.



Going nuts

You can also reapply that generator expression idea to the first loop and end with something like:

def calculate_score(filename):
    """Reads names and returns total scores."""
    letter_scores = {letter: index for index, letter in enumerate(string.ascii_uppercase, 1)}
    with open(filename) as names:
        names = sorted(names.read().replace('"', '').split(','))
        return sum(
            sum(letter_scores[letter] for letter in name) * index
            for index, name in enumerate(names, 1)
        )