2015-11-30 146 views
0

我的程序是一個數學測驗。用戶完成10個問題,然後獲得分數。然後需要將該分數附加到文本文件。導入數據到文本文件

if classs == "1": 
    text_file = open("Class1.txt", "r") 
    data = text_file.read() 
    text_file.close() 
    if name in data: 
     searchName(name, score) 
    else: 
     text_file = open("newFileName.txt","a") 
     text_file.write(str(name) +","+ str(score)+ "\n") 
     text_file.close() 

    questions = 0 
    score = 0 
    break 

該代碼塊將用戶評分和名稱附加到文本文件中。

但是我需要做到這一點,如果用戶已經參加了測驗,分數會附加到該名稱上,而不是創建新的值。應該附加分數,直到一個名稱有三個分數,然後如果再次進行測驗,它將刪除第一個分數並追加最新的分數。

def searchName(name, score): 
    with open("Class1.txt", 'r') as f: 
     data = f.read().split('\n') 
     print(data) 
     with open("newFileName.txt", 'w') as newFile: 
      for line in data: 
       if name in line:   
        line+=(',') + str(score) + (',') 
       newFile.write(line + '\n') 

但它只保存1分並在測驗再次進行後將其刪除。

Dion,0 
Jarrod,1 
Jake Bing,6 
Charlie,2,5 

恢復到

Dion,0 
Jarrod,1 
Jake Bing,6,5 
Charlie,2, 

如果另一個用戶使用測驗(傑克兵)

+5

您不能附加到文件中間的行。您需要保存該行,將其刪除,追加新數據,然後將其寫回 –

回答

0
def main(): 

data_file = open("C:\Users\sama0714\Test\\test.txt"); 

data = dict() 
new_score = ("Jake Bing", 4) 

for line in data_file.readlines(): 
    record = line.split(':') 
    data[record[0]] = list(record[1].split(',')) 

try: 
    data[new_score[0]].append(new_score[1]) 
except KeyError: 
    data[new_score[0]] = list(str(new_score[1])) 

data_file.close() 

data_file = open("C:\Users\sama0714\Test\\test.txt","w"); 
for name, scores in data.items(): 
    data_file.write(name + ":" + ",".join(str(i) for i in scores)) 

data_file.close() 

在評論作爲所述讀取整個文件,更改數據,並將其寫回。

我使用的字典在這裏可以快速訪問數據的訪問特定玩家的信息,使用可以使用任何數據處理程序list或「set`等

我修改了數據結構的文件中是如下以便輕鬆創建詞典。 (:從分數分離名)

查理:2,5-

翁:0

賈羅德:

傑克冰:4

我試圖消除KeyError失敗的情況下,這是第一次嘗試在任何

0

處理此問題的最簡單方法可能是爲每個類創建一個字典(儘管如果類中存在重複的名稱,這將容易出現問題)。對於每個名稱(字典鍵),您可以創建一個列表並將分數附加到列表中。當你完成輸入處理後,你可以一次性寫出所有的分數。這比反覆讀寫文件更有效。它可能是這個樣子(創建student_dictif classs...聲明後):

def search_name(name, score, student_dict): 

    if name not in student_dict.keys(): 
     student_dict[name]=[] 
    student_dict[name].append(score) 

    return student_dict #{"student_name":[score_1,score2], ... } 

當你處理完分數,那麼你可以寫分數的名稱和列表直接一步到位的文件。理想情況下,我會完全廢除search_name,只需將所有名稱和分數直接導入字典中,然後再將字典寫入文件中。有關如何編寫字典的更多信息,請查看this。要了解如何將列表轉換爲字符串,請查看this page。如果您還有其他問題,請告訴我。