2016-10-25 4 views
0

У меня есть файл с рекордом для игры тральщика, которую я создаю, и каждый раз после того, как она добавляется с новыми оценками, я хочу, чтобы она сортировалась по строке прерывания.Сортировка текстового файла на строку прерывания

Я использую:

def save_score(score): 
    name = input("type a name") 
    file = open("highscores.txt", "a") 
    file.write("Table: "+str(GRID_TILES)+"x"+str(GRID_TILES)+"\t mode:"+str(Dif)+"\t score:"+str(score)+"\t name:"+str(name)+"\n") 
    file.close() 

который выходит в следующем формате:

table: 10x10 mode: easy score: 7592 name:Test 
table: 5x5  mode: medium score: 2707 name:Test 

Как я могу сделать так, чтобы после того, как либо file.write или file.close сортирует файл в каждой строке?

Я хочу, чтобы оно сортировалось только по столу. Неважно, в каком порядке, пока все таблицы, которые 7x7, пройдут те, которые также являются 7x7.

Я попытался сделать это:

def save_score(score): 
    name = input("type a name") 
    file = open("highscores.txt", "a") 
    file.write("table: "+str(GRID_TILES)+"x"+str(GRID_TILES)+"\t mode: "+str(Dif) +"\t score: "+str(score)+"\t name: "+str(name)+"\n") 
    file.close() 
    file = open("scores.txt", "r") 
    file2 = open("highscores.txt", "w") 
    file2.writelines(sorted(file, key=lambda line:str(line.split()[0]))) 
    file.close() 
    file2.close() 

Я хочу, чтобы мой код как можно короче, так как вся тральщик займет некоторое сумму коды.

+0

Возможно, вы можете указать пример ожидаемого результата. – MervS

+0

Извините, я не являюсь родным для английского языка, вы можете объяснить это дальше? –

+0

Можете ли вы показать пример того, как выглядит файл после сортировки, которую вы хотите. – MervS

ответ

0

Вот один из способов:

import shutil 
from tempfile import NamedTemporaryFile 


def insert_sorted(file_obj, in_line): 
    flag = False 
    with NamedTemporaryFile(delete=False, mode="w+") as temp: 
     try: 
      val = int(in_line.split()[-2]) 
     except (IndexError, ValueError): 
      raise Exception("Invalid format") 

     for line in file_obj: 
      try: 
       lineval = int(line.split()[-2]) 
      except (IndexError, ValueError): 
       print("""following line has an invalid format,\ 
       and gets escaped\n{}""".format(line)) 
      else: 
       # Write larger score first when we find smaller score 
       if lineval <= val: 
        temp.write(in_line) 
        temp.write(line) 
        flag = True 
        break 
       else: 
        temp.write(line) 

     for line in file_obj: 
      temp.write(line) 
     # if the score of the in_line is grater than all the lines write it at the trailing. 
     if not flag: 
      temp.write(in_line) 
    return temp 

with open(file_name) as f: 
    in_line = "table: 10x10 mode: easy score: 8592 name:Test" 
    temp = insert_sorted(f, in_line) 
    shutil.move(temp.name, file_name) 
+0

Учитывая, что это Python 3, вы хотите явно открыть 'NamedTemporaryFile' в текстовом режиме (' mode = "w +" '). В противном случае вы читаете 'str' из исходного файла и пытаетесь записать' str' в двоичный режим 'NamedTemporaryFile', который принимает только' bytes'. Кроме того, вы забыли написать 'in_line' вообще. – ShadowRanger

+0

@ShadowRanger Хорошая добыча! спасибо за внимание, просто исправлено. – Kasramvd

+0

У вас все еще была проблема (ни один из оценок выше, чем новый балл был написан). Я отредактировал, проверьте меня, пожалуйста. – ShadowRanger

0
def save_score(score): 
    name = input("type a name") 
    with open("scores.txt", "a") as file: 
     file.write("table: {}x{}\t mode: {}\t score: {}\t name: {}\n".format(
        GRID_TILES, GRID_TILES, Dif, score, name)) 

    with open("scores.txt") as file, open("highscores.txt", "w") as file2: 
     file2.writelines(sorted(file, key=lambda line: line.split()[1])) 

Благодаря Frerich Раабе для подачи меня с ответом!

+0

Я сделал некоторые основные очистки на этом (только функциональное различие заключается в том, что использование операторов 'with' означает, что файлы гарантированно закрываются неявно в конце блока' with', даже при наличии исключений). Не стесняйтесь откатывать его, но это _much_ больше Pythonic/readable и даже более кратким (потому что не нужны вызовы '.close()'). Одна заметка: Конечно, файл, открытый для добавления, должен быть 'scores.txt'? В противном случае вы добавите новую строку в 'highscores.txt', затем сразу же взорвите ее, заменив ее отсортированным содержимым' scores.txt'. – ShadowRanger

+0

@ShadowRanger Боюсь, мне нужно изменить код обратно, так как эта обновленная версия не работает. И да, вы больше правы на добавленной части 'highscores.txt'. Я исправил эту ошибку. –

+0

Кажется, не работает? OOC, что ломается? Я бы настоятельно советовал использовать выражения 'with', если ничего другого; в противном случае вы окажетесь в состоянии случайно забыть закрыть файлы или даже если вы помните, если вызов «закрыть» обошел, когда возникает исключение. – ShadowRanger

Смежные вопросы