2016-11-12 470 views
1

我試圖將數據追加到文件中。每行寫入一個函數。下面是根據我的實際代碼示例代碼:將數據追加到python文件的末尾

a = 0 

def data(): 
    global a 
    a = int(raw_input('Enter value for a\n>')) 
    write() 

def write(): 
    f = open('path\\to\\file.txt', "a") 
    f.write('%s\n' % a) 
    f.close 
    proceed() 

def proceed(): 
    should = raw_input('Please press enter to continue or type in 0 to stop\n>') 
    if should == '0': 
     return 
    else: 
     data() 

data() 

當我運行的代碼,並給予,例如,1, 2 and 3作爲一個值,這是它如何被寫入文件:

3 
2 
1 

但我希望它被寫入到文件中這樣說:

1 
2 
3 

什麼是這樣做的正確方法?每次運行write函數時,如何在文件末尾追加一個新行?

+1

'f.close'不關閉文件!並且不推薦使用全局數據傳遞數據。使用參數。最後,我真的不明白你爲什麼得到這個輸出。追加模式不能恢復線條的順序,這是沒有意義的。 –

+0

@ Jean-FrançoisFabre非常感謝。得到它的工作。 – rsnaveen

+0

@ Jean-FrançoisFabre這就是我也不理解的。即使文件沒有關閉,也不應該總是將文件數據追加到文件末尾? – rsnaveen

回答

2

你的程序結構引起了一個可能非常深的遞歸(問題)。因爲在data()中,調用write(),在write()中調用proceed(),在proceed()中再次調用data()。儘量避免這種結構。下面的代碼避免了這個問題,並且更短:

def data(): 
    while True: 
     a = int(raw_input('Enter value for a\n>')) 
     f.write(str(a) + '\n') 

     should = raw_input('Please press enter to continue or type in 0 to stop\n>') 
     if should == 0: 
      break 


f = open('path\\to\\file.txt', "a") 
data() 
f.close() 
+0

我提供的示例代碼只是爲了顯示我的實際代碼的結構。爲了獲得輸入並將其寫入文件,您的代碼可以很好地工作。但在我的原始代碼中,我有很多函數,並且爲了使每個後續函數正確運行,前一個函數應該沒有任何錯誤地運行。這就是爲什麼我這樣構建我的代碼。但是,你能否解釋爲什麼追加行爲的方式與文件未正確關閉時的行爲方式相同?謝謝。 – rsnaveen

+0

實際代碼的結構會引起可能的遞歸錯誤。這意味着您可以在解釋器拋出錯誤之前多次調用data(),因爲它會調用一個調用函數的函數,該函數會再次調用data()。這個鏈條中的呼叫必須由口譯員來跟蹤,並且只有這麼多的存儲空間才能這樣做。所以最後,你將用盡堆棧空間 - 歡迎來到Stackoverflow :)我不知道爲什麼值寫在自上而下當你不正確關閉你的文件。我想這可能是在close()語句之前不刷新的文件緩衝區。 – Ukimiku

+0

非常感謝@Ukimiku。我會嘗試重構我的程序,以避免遞歸錯誤:) – rsnaveen

1

@Ukimiku已經給出了實現您的要求的正確方法。至於爲什麼你的代碼的行爲如此,我的意見就在這裏。 實際上,用open('path','a')打開文件會將文件指針移動到您打開的文件的末尾,以便在您使用write()時追加一些內容。

f = open('path\\to\\file.txt', "a") 
print f.tell() #get the position of current file pointer 
f.write('%s\n' % a) 

後您添加print f.tell()打開file.txt的。每當您打開它時,都會發現指針位置始終爲0,這表示您的操作在該文件的開頭插入了這些數字。這是因爲沒有關閉而發生的。這些更改發生在內存中,尚未寫入磁盤。

+0

非常感謝解釋:) – rsnaveen