2014-12-07 142 views
0

我有寫用戶名+姓氏+分數在excel文件中的代碼。但我希望它具有標題,例如第一行中的「姓名」「姓氏」和「分數」。然後每次代碼重新啓動時,我都希望新數據存儲在這些標題下的新列中。將字符串寫入一個新行

+1

請使用縮進來重新發布您的代碼。鑑於縮進在Python中的重要性,我們只能猜測代碼的原意。 – kdopen 2014-12-07 17:43:21

+0

@kdopen抱歉,我不知道如何以確切的方式發佈它,所以我認爲你只需要使所有內容符合文本。現在修復縮進。 – ImYu 2014-12-07 18:07:04

回答

2

您需要檢測您打開的文件是否已經有一行或多行寫入到它之前。執行此操作的簡單方法是在以附加模式打開文件後,調用文件上的tell方法。 tell將報告文件中的當前位置,這將在追加模式下結束。如果位置爲0,則只需要寫入標題,因爲這表示文件爲空。

if form == 'a': #if form entered is a 
    with open ('classa.csv','a',newline='') as keerthan: 
     foo = csv.writer(keerthan,delimiter=',',) 

     if keerthan.tell() == 0:      # add this test! 
      bar = ['Name', 'Surname', 'Score'] 
      foo.writerow(bar) 

     bar = [[user,surname, score]] 
     foo.writerows(bar) 

另一件事(無關的文件頭的問題):你真的應該避免不同if語句之間重複這麼多的代碼。通常,您可以重複使用相同的邏輯,只需使用不同的值。這裏是你如何可以打開if以上爲代碼的通用位,可以用於所有三種形式:

filename = "class{}".format(form)  # use string formatting to get the right filename 
with open (filename,'a',newline='') as keerthan: # open the file using a variable name 
    foo = csv.writer(keerthan,delimiter=',',) 

    if keerthan.tell() == 0: 
     bar = ['Name', 'Surname', 'Score'] 
     foo.writerow(bar) 

    bar = [[user,surname, score]] 
    foo.writerows(bar) 

你或許可以做您的問與答& A碼類似的東西,有了答案和arithmatic運營商被存儲在變量中。

+0

謝謝你的回覆。現在我明白如何清理我的工作^^。感謝您的幫助,但對於標題部分,我輸入了您的建議,但出現錯誤。第83行,在 if keerthan.tell()== 0:#添加此測試! ValueError:關閉文件的I/O操作。 P.s - 當代碼運行時,它會第一次創建一個名爲class a的文件,所以在那裏什麼也沒有,第二次運行時第一個數據會在那裏。 – ImYu 2014-12-07 20:23:13

+0

我檢查了excel文件,標題似乎在那裏,但由於我有這樣的錯誤,我不認爲我的數據相應地存儲在例如名稱+姓氏+分數。 – ImYu 2014-12-07 20:32:01

+0

嗯,那個錯誤表明文件'keerthan'在你調用'tell'之前已經關閉了。你確定你的代碼縮進了嗎? 'tell()'調用需要在'with open(...)as keerthan'行後面的塊的一部分進行縮進。一個'with'語句在塊結束時自動關閉文件。 – Blckknght 2014-12-07 23:03:23