2016-03-05 120 views
2

我尝试了可以​​写入的每种格式。每当Python到达要追加到Scores.csv的行时,它就会覆盖该文件。“a”覆盖文件而不是追加

有没有错误,它只是不会追加。我不确定是否因为我正在尝试写入.csv文件而不是.txt,但是如果是因为这个原因,则必须有一种解决方法。

下面是错误代码:

#OPEN TEMP_SCORES FILE FOR READING 
with open("temp_Scores.csv", "r") as scorefile: 
    print("\nDEBUG: temp_Scores.csv is open.") 
    reader = csv.DictReader(scorefile) 
    for row in reader: 
     print("\nDEBUG: Reading temp_Scores.csv..") 
     with open("Scores.csv", "w") as scorefile: 
      print("\nDEBUG: Scores.csv is open for writing...") 
      fieldnames = ["Name", "Class", "Score 1", "Score 2", "Score 3"] 
      writer = csv.DictWriter(scorefile, fieldnames=fieldnames) 

      #This line writes the actual "header" or "titles" 
      writer.writeheader() 

      NameExists = False 
      #LOGIC TO DETERMINE WHAT TO WRITE 
      #if new user's name is the same as in the file; 
      if row["Name"] == UserData["Name"]: 
       NameExists = True 
       print("\nDEBUG: Name was found in temp_Scores.csv. Overwriting line..") 

       #if Score 1 doesn't exist; 
       if len(row["Score 1"]) == 0: 
        #makes NEW SCORE 1 the user's score 
        row["Score 1"] = UserData["Score"] 
        #actually write new scores to file 
        writer.writerow({"Name": row["Name"], "Class": UserData["Class"], "Score 1": row["Score 1"], "Score 2": row["Score 2"], "Score 3": row["Score 3"]}) 

       #if Score 2 doesn't exist; 
       elif len(row["Score 2"]) == 0: 
        #makes NEW SCORE 2 the user's score 
        row["Score 2"] = UserData["Score"] 
        #actually write new scores to file 
        writer.writerow({"Name": row["Name"], "Class": UserData["Class"], "Score 1": row["Score 1"], "Score 2": row["Score 2"], "Score 3": row["Score 3"]}) 

       #if Score 3 doesn't exist; 
       elif len(row["Score 3"]) == 0: 
        #makes NEW SCORE 3 the user's score 
        row["Score 3"] = UserData["Score"] 
        #actually write new scores to file 
        writer.writerow({"Name": row["Name"], "Class": UserData["Class"], "Score 1": row["Score 1"], "Score 2": row["Score 2"], "Score 3": row["Score 3"]}) 

       #if all Scores exist already; (update scores) 
       else: 
        #makes NEW SCORE 3 the user's current score 
        newScore3 = UserData["Score"] 
        #makes NEW SCORE 2 the user's OLD SCORE 3 
        newScore2 = row["Score 3"] 
        #makes NEW SCORE 1 the user's OLD SCORE 2 
        newScore1 = row["Score 2"] 
        #gets rid of OLD SCORE 1 

        #actually write new scores to file 
        writer.writerow({"Name": row["Name"], "Class": UserData["Class"], "Score 1": newScore1, "Score 2": newScore2, "Score 3": newScore3}) 

       print("\nDEBUG: Updated new user's line") 

    #if new user's name DOESN'T exist in the file already; 
    if NameExists == False: 
     print("\nDEBUG: Name was not found in temp_Score.csv. Appending new line..") 
     #saves new user's details into a NEW LINE in the ORIGINAL FILE 
     with open("Scores.csv", "a") as scorefile: 
      fieldnames = ["Name", "Class", "Score 1", "Score 2", "Score 3"] 
      writer = csv.DictWriter(scorefile, fieldnames=fieldnames) 

      writer.write({"Name": UserData["Name"], "Class": UserData["Class"], "Score 1": UserData["Score"], "Score 2": "", "Score 3": ""}) 

      print("\nDEBUG: Appended new line onto existing file") 

#temp_Scores.csv is no longer needed, so we're getting rid of it 
os.remove("temp_Scores.csv") 
print("\nDEBUG: Deleted temp_Scores.csv.") 

非常感谢提前任何帮助。

+0

你确定问题不是'打开(“Scores.csv”,“w”)作为scorefile'位? – user2357112

回答

0

我已经做了几个小时的思考和重新编码。

@ jDo下面的答案是正确的,因为这段代码重新定义了“scorefile”多行,这导致只有一行被写入文件。

我已经重写考虑整个代码,并与工作解决方案上来:

NameExists = False 
    linesToWrite = {} 
    with open("Scores.csv", "r") as scorefile: 
     reader = csv.DictReader(scorefile) 
     for row in reader: 
      if row["Name"] == UserData["Name"]: 
       NameExists = True 
       if len(row["Score 1"]) == 0: 
        newScore1 = UserData["Score"] 
        newScore2 = "" 
        newScore3 = "" 
        print("\nDEBUG: Writing Score 1: " + newScore1 + " to line " + str(reader.line_num)) 
       elif len(row["Score 2"]) == 0: 
        newScore1 = row["Score 1"] 
        newScore2 = UserData["Score"] 
        newScore3 = "" 
        print("\nDEBUG: Writing Score 1: " + newScore1 + ", Score 2: " + newScore2 + " to line " + str(reader.line_num)) 
       elif len(row["Score 3"]) == 0: 
        newScore1 = row["Score 1"] 
        newScore2 = row["Score 2"] 
        newScore3 = UserData["Score"] 
        print("\nDEBUG: Writing Score 1: " + newScore1 + ", Score 2: " + newScore2 + ", Score 3: " + newScore3 + " to line " + str(reader.line_num)) 
       else: 
        newScore1 = row["Score 2"] 
        newScore2 = row["Score 3"] 
        newScore3 = UserData["Score"] 
        print("\nDEBUG: Writing Score 1: " + newScore1 + ", Score 2: " + newScore2 + ", Score 3: " + newScore3 + " to line " + str(reader.line_num)) 
       linesToWrite[reader.line_num] = {"Name": row["Name"], "Class": UserData["Class"], "Score 1": newScore1, "Score 2": newScore2, "Score 3": newScore3} 
      else: 
       linesToWrite[reader.line_num] = {"Name": row["Name"], "Class": row["Class"], "Score 1": row["Score 1"], "Score 2": row["Score 2"], "Score 3": row["Score 3"]} 
    with open("Scores.csv", "w") as scorefile: 
     fieldnames = ["Name", "Class", "Score 1", "Score 2", "Score 3"] 
     writer = csv.DictWriter(scorefile, fieldnames=fieldnames) 
     writer.writeheader() 
     for key, line in linesToWrite.items(): 
      writer.writerow(line) 
    if not NameExists: 
     linesToWrite = {"Name": UserData["Name"], "Class": UserData["Class"], "Score 1": UserData["Score"], "Score 2": "", "Score 3": ""} 
     with open("Scores.csv", "a") as scorefile: 
      fieldnames = ["Name", "Class", "Score 1", "Score 2", "Score 3"] 
      writer = csv.DictWriter(scorefile, fieldnames=fieldnames) 
      writer.writerow(linesToWrite) 

感谢的人谁分布在思想或可能的解决方案。

1

您在嵌套循环中多次重新定义“scorefile”。尝试给每个打开的文件一个新的句柄名称(“scorefile1”,“scorefile2”,“scorefile3”或其他)以消除歧义。

此外,我没有看到循环外的“NameExists”的任何定义 - 是否在您粘贴的代码之前定义?

+0

我没有写入多个文件,只有一个。 – Medallyonify

+0

另外,是的,NameExists是在我的代码片段之前定义的。 – Medallyonify

+1

@Medallyonify你说得对。您只写入一个文件,但您在同一个句柄下打开多个文件。取消嵌套“打开”可能会修复它,因为这意味着一次只能打开一个文件(我认为对单个csv文件的更改(Scores.csv不会产生变化))。无论如何,很高兴你解决了它:) – jDo

相关问题