2014-02-17 19 views
0

我有一段代碼將一個用戶名和分數附加到一個文件中,但是我想知道如何才能使它成爲只有10個名字和分數可以在文件上時間。我的代碼如下:附加到一個文件的最大數據段

def storescores(): 
    hs = open("hst.txt", "a") 
    hs.write(name + " ") 
    hs.write(str(score) + "\n") 
    hs.close() 

有沒有什麼辦法讓它這樣,如果10名都已經在列表上,則沒有更多的可以加入?如果這需要某種形式的分類方法(選擇,泡沫等),那麼你能否把它放入?

+1

你想只有_top_ 10分數嗎?或者只有最近的10家商店?或者只有_first_ 10分數? – abarnert

+0

如果「只有前10個分數」意味着如果我擊敗了一個分數,那麼最低分被刪除並且新分數被添加,那麼是的,如果它不是太麻煩 – RyanH2796

回答

0

首先,無論你做什麼都需要從文件中讀取多達10行。

如果您只想保留前10個分數,然後停止錄製新分數,那很容易。我將使用linecache模塊提高效率(因此,如果您連續1000次呼叫storescores,它會記住它已經在尋找並且未能找到第10行)。這將返回一個空字符串,如果少於10行,或者第10行,如果有10個或更多。所以:

def storescores(): 
    if linecache.getline("hst.txt", 10): 
     print("Already stored 10 scores, sorry") 
     return 
    hs.close() 
    hs = open("hst.txt", "a") 
    hs.write(name + " ") 
    hs.write(str(score) + "\n") 
    hs.close() 

如果你想要最近的10個分數,你將不得不讀取行,然後寫出一個新的文件。就像這樣:

def storescores(): 
    with open("hst.txt") as hs: 
     lines = list(hs) 
    lines.append(name + " " + score + "\n") 
    lines = lines[-10:] 
    with open("hst.txt", "w") as hs: 
     for line in lines: 
      hs.write(line) 

如果你想頂部 10分,你可以做同樣的事情,但增加在中間的排序步驟。沒有必要編寫明確的選擇排序或冒泡排序 - 事實上,你不想這麼做,因爲這些排序算法並不是首選。只需撥打名單上的sort方法即可。

棘手的一點是,要排序的得分,而不是整個行(否則「鮑伯100」比「安德魯200」更高的分數),並在得分多項相當比作爲一個字符串(否則,「2」比「10」更高)。所以,你需要一個key function來分割字符串,取最後一位,並把它變成一個數字。所以:

def storescores(): 
    with open("hst.txt") as hs: 
     lines = list(hs) 
    lines.append(name + " " + score + "\n") 
    lines.sort(key=lambda line: int(line.split()[-1])) 
    lines = lines[-10:] 
    with open("hst.txt", "w") as hs: 
     for line in lines: 
      hs.write(line) 

有辦法可以進一步改善這一點。例如,您可能不想在原地重寫文件,而是需要寫入新的臨時文件,然後在完成後將其複製到文件中(因此,如果有人在運行程序中間拔出插頭,則會最終得到舊分數或新分數,而不是截斷的部分文件)。或者您可能希望以最明智的方式使用heapqbisect模塊將新分數置入適當的排序位置,而不是重新排序整個已排序的列表(當只有10個條目時它不重要)。等等。但是這應該足以讓你開始。

+0

謝謝,第三個是我正在尋找的東西因爲,但它通過首先將最小的分數排序,有沒有什麼方法可以將最高分放在第一位? (例如,當我更喜歡[18,11,2]時,列表的順序是[2,11,18]) – RyanH2796

+0

@ user3320839:當然。簡短的版本是,使用「反向」參數來排序。但是你真的應該閱讀我鏈接並理解你所能做的所有事情的排序HOWTO。 (請注意,如果您顛倒順序,您還需要保留前10個:'lines [:10]',而不是最後10個'lines [-10:]'。) – abarnert

+0

謝謝,我會書籤該頁面。如果我想在程序中寫出它們,你知道我在哪裏可以找到一個實際上具有各種排序方法代碼的頁面嗎? – RyanH2796

0

有沒有內置的方式來做這樣的事情。什麼你需要做的是一樣的東西

  1. 讀取文件中
  2. 添加最新的比分
  3. 檢查列表,查看是否有太多的分數,如果有,刪除一個
  4. 寫入文件
相關問題