2016-10-25 3 views
0

Ich habe eine Highscore-Datei für ein Minesweeper-Spiel, das ich erstelle und jedes Mal, nachdem es mit den neuen Partituren hängt, will ich es pro Bruchlinie sortieren.Sortieren Textdatei pro Bruchlinie

Ich verwende:

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

, die in diesem Format kommt aus:

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

Wie kann ich es machen, so dass nach dem Eintritt der file.write oder die file.close es die Datei pro Zeile sortiert?

Ich möchte es nur nach Tabelle sortiert werden. Es spielt keine Rolle in welcher Reihenfolge, solange alle Tabellen, die 7x7 sind, an denen liegen, die auch 7x7 sind.

Ich habe versucht, dies zu tun:

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

Ich möchte meinen Code halten, so kurz wie möglich, da die gesamte Minensuchboot wird schon einige ammount Code aufzunehmen.

+0

Vielleicht können Sie ein Beispiel für Ihre erwartete Ausgabe angeben. – MervS

+0

Es tut mir leid, ich bin nicht in der englischen Sprache geboren, können Sie das weiter erklären? –

+0

Können Sie ein Beispiel zeigen, wie die Datei nach der gewünschten Sortierung aussieht? – MervS

Antwort

0

Hier ist eine Möglichkeit:

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

Da Python 3 ist, möchten Sie 'NamedTemporaryFile' explizit im Textmodus öffnen (' mode = "w +" '). Andernfalls lesen Sie 'str' aus der Originaldatei und versuchen,' str' in einen binären Modus 'NamedTemporaryFile' zu ​​schreiben, der nur' bytes' akzeptiert. Außerdem hast du vergessen, 'in_line' zu ​​schreiben. – ShadowRanger

+0

@ShadowRanger Guter Fang! Danke für den Hinweis, nur behoben. – Kasramvd

+0

Sie hatten immer noch ein Problem (keiner der Punkte, die höher waren als der neue Punktestand wurde geschrieben). Ich habe bearbeitet, überprüfe mich bitte. – 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])) 

Dank Frerich.Raabe für mich mit einer Antwort liefern!

+0

Ich habe einige wichtige Aufräumarbeiten daran gemacht (nur der funktionale Unterschied ist, dass die Verwendung von 'with' Statements bedeutet, dass Dateien implizit am Ende von' with' Block geschlossen werden, selbst wenn Ausnahmen vorhanden sind). Fühlen Sie sich frei, es zurückzurollen, aber das ist _much_ mehr Pythonic/lesbar und noch prägnanter (weil keine '.close()' Anrufe benötigt werden). Eine Anmerkung: Sicherlich sollte die Datei zum Anhängen 'scores.txt' sein? Andernfalls fügen Sie eine neue Zeile an "highscores.txt" an und blenden sie sofort weg, indem Sie sie durch den sortierten Inhalt der 'scores.txt' ersetzen. – ShadowRanger

+0

@ShadowRanger Ich fürchte, ich muss den Code zurück ändern, da diese aktualisierte Version nicht zu funktionieren scheint. Und ja, du bist mehr als richtig auf dem 'highscores.txt' Teil angehangen. Ich habe diesen Fehler korrigiert. –

+0

Scheint nicht zu funktionieren? OOC, was bricht? Ich würde _strongly_ empfehlen, '' 'Anweisungen zu verwenden, wenn nichts anderes; Andernfalls landen Sie in einer Position, in der Sie versehentlich vergessen, Dateien zu schließen, oder sogar, wenn Sie sich erinnern, dass der Aufruf "close" bei einer Ausnahmebedingung umgangen wird. – ShadowRanger