2015-06-15 2 views
0

Для моей работы я должен иметь возможность сортировать оценки пользовательской викторины в текстовом файле по алфавиту. Когда я однако использовать:Ошибка при сортировке текстового файла по алфавиту

with open(filename, 'a') as f: 
     f = open(filename, "r") 
     lines = [line for line in f if line.strip()] 
     f.close() 
     lines.sort() 

, а затем распечатать результаты с помощью оболочки Python, когда пользователь запрашивает я использовал:

if get_bool_input("Do you wish to view previous results for your class"): 
    with open(filename, 'r') as f: 
     print(f.read()) 

Однако это не сортирует результаты, но держит их в том порядке, они были представлены, как показано здесь:

Do you wish to view previous results for your classyes 
Kyle : 4 
Dan : 0 
Jana : 0 
Kyle : 0 
Kyle : 0 
Kyle : 9 
Kyle : 6 
Bob : 2 
Bobby : 1 
Kyle : 1 
Kyle : 0 
Kyle : 1 
Kyle : 10 
Bobby Mclobby : 7 
Bobby Mcdobby : 5 
Kyle Cliffe : 9 

Вот весь код для тех, кто интересно:

import random 
import operator 

OPERATIONS = [ 
    (operator.add, "+"), 
    (operator.mul, "*"), 
    (operator.sub, "-") 
    ] 

NB_QUESTIONS = 10 

def get_int_input(prompt=''): 
    while True: 
     try: 
     return int(input(prompt)) 
     except ValueError: 
     print("Not a valid input (integer is expected)") 

def get_bool_input(prompt=''): 
    while True: 
     val = input(prompt).lower() 
     if val == 'yes': 
      return True 
     elif val == 'no': 
      return False 
     else: 
      print("Not a valid input (yes/no is expected)") 

if __name__ == '__main__': 
    name = input("What is your name?").title() 
    class_name = input("Which class do you wish to input results for? ") 
    print(name, ", Welcome to the OCR Controlled Assessment Maths Test") 

    score = 0 
    for _ in range(NB_QUESTIONS): 
     num1 = random.randint(1,25) 
     num2 = random.randint(1,25) 
     op, symbol = random.choice(OPERATIONS) 
     print("What is", num1, symbol, num2) 
     if get_int_input() == op(num1, num2): 
      print("Correct") 
      score += 1 
     else: 
      print("Incorrect") 

    print("Well done", name, "you scored", score, "/", NB_QUESTIONS) 

    filename = class_name + ".txt" 

    with open(filename, 'a') as f: 
     f.write(str(name) + " : " + str(score) + '\n') 

    with open(filename, 'a') as f: 
     f = open(filename, "r") 
     lines = [line for line in f if line.strip()] 
     f.close() 
     lines.sort() 

    if get_bool_input("Do you wish to view previous results for your class"): 
     with open(filename, 'r') as f: 
      print(f.read()) 
    else: 
     input ("Press any key to exit") 
+0

Параметр 'with' конструкция открывает и присваивает дескриптор переменной' F 'в этом случае. Вы не должны этого делать: 'f = open (имя файла,« r »)' внутри 'with'. – ssundarraj

ответ

0

Это связано с тем, что вы не изменяете данные файла.

Поскольку вы уже прочитали и отсортировали строки, почему вы не просто распечатать его прямо из переменной, как так

if get_bool_input("Do you wish to view previous results for your class"): 
    for line in lines: 
     print line 
Смежные вопросы