2015-02-06 126 views
0

我有一個函數可以模擬某些東西並將結果數組寫入文本文件。Python寫入函數輸出到文件

例如,

def SimulationFunction(args): 
    #some simulation which results simOUT 
    f = open('results.txt','w') 
    f.write(str(simOUT) + '\n') 
    f.close() 

我想運行變化的輸入參數的函數,輸出保存到同一RESULTS.TXT文件的新行。

例如,

for i in inputArgs: 
    SimulationFunction(i) 

然而,當我嘗試運行此,生成的文本文件只 包含了最近模擬運行的結果。

我在這裏錯過了什麼? 任何建議將不勝感激!

回答

2

你必須append到文件不是write到文件。
這裏是修復:

f = open('results.txt','a') 

'w'意味着你正在寫的文件(覆蓋)
'a'意味着要附加到文件

如果您想了解更多關於不同模式打開文件,請訪問: http://www.tutorialspoint.com/python/python_files_io.htm

+0

謝謝!!!!!!!!! – user32147 2015-02-06 05:30:35

4

您必須附加到該文件,而不是覆蓋它。

根據Python袖珍參考(馬克魯茲O'rielly):

模式是可選的字符串,用於指定在其中文件被打開的模式。它默認爲'r',這意味着可以在文本模式下閱讀。其他常用值爲'w'用於寫入(如果文件已存在則截斷該文件)和'a'用於附加。

下面是模式打開(): (根據Tutorials Point

r - 打開一個文件爲只讀。文件指針位於文件的開頭。這是默認模式。

rb - 以二進制格式打開只讀文件。文件指針位於文件的開頭。這是默認模式。

r+ - 打開文件進行讀寫。文件指針將位於文件的開頭。

rb+ - 以二進制格式打開文件以讀寫文件。文件指針將位於文件的開頭。

w - 打開一個文件只寫。如果文件存在,則覆蓋該文件。如果文件不存在,則創建一個新文件進行寫入。

wb - 打開一個只能以二進制格式寫入的文件。如果文件存在,則覆蓋該文件。如果文件不存在,則創建一個新文件進行寫入。

w+ - 打開文件進行寫入和讀取。如果文件存在,則覆蓋現有文件。如果該文件不存在,則創建一個用於讀取和寫入的新文件。

wb+ - 以二進制格式打開一個用於寫入和讀取的文件。如果文件存在,則覆蓋現有文件。如果該文件不存在,則創建一個用於讀取和寫入的新文件。

a - 打開一個文件進行追加。如果文件存在,文件指針位於文件末尾。也就是說,該文件處於追加模式。如果文件不存在,它將創建一個新文件進行寫入。

ab - 打開文件以二進制格式附加。如果文件存在,文件指針位於文件末尾。也就是說,該文件處於追加模式。如果文件不存在,它將創建一個新文件進行寫入。

a+ - 爲追加和讀取打開文件。如果文件存在,文件指針位於文件末尾。該文件以附加模式打開。如果文件不存在,它會創建一個新的文件用於讀寫。

ab+ - 以二進制格式打開用於追加和讀取的文件。如果文件存在,文件指針位於文件末尾。該文件以附加模式打開。如果文件不存在,它會創建一個新的文件用於讀寫。

此外,'w''a'將創建一個文件,如果它不存在,而'r'將拋出IOError類型的異常。

+0

您不應該複製和粘貼文檔,而只需鏈接該網站。 – taesu 2015-02-06 00:47:54

+0

這是有爭議的。我以前被拒絕投票,因爲我可以分享這些信息。 – 2015-02-06 02:13:45

+0

@Charles謝謝! – user32147 2015-02-06 05:30:01

1

open()通話使用"a"(追加)模式等建議將解決您的眼前問題,但你不必擔心如何清除出該文件每次運行或創建它,如果它不存在,等等。您可以使用"w"模式作爲第一個功能,使用"a"作爲後續模式,但這會引入必須以正確順序調用它們的情況。當你需要它們的順序不同時,可能會在六個月內再次咬你,並且必須追查爲什麼只有其中一些出現在文件中(因爲具有「w」作爲模式的那個現在在中間)。

更好的方法是打開文件功能,在把它作爲一個參數(可能使用周圍的功能with語句調用所以它就會自動關閉後)。這不僅避免了需要擔心你的每一個功能模式,它避免了重複打開和關閉的文件,這是一個低效率的(雖然在現代系統中較小者):

def SimulationFunction1(args, outfile): 
    # some simulation, which results in simOUT 
    outfile.write(str(simOUT) + '\n') 

with open("my_output_file.txt", "w") as out: 
    SimulationFunction1(args, outfile=out) 
    SimulationFunction2(args, outfile=out) 
    SimulationFunction3(args, outfile=out) 

或者更好的,只是有功能結果,並具有來電處理它們寫:

def SimulationFunction1(args): 
    # some simulation, which results in simOUT 
    return str(simOUT) 

with open("my_output_file.txt", "w") as out: 
    out.write(SimulationFunction1(args) + `\n`) 
    out.write(SimulationFunction2(args) + `\n`) 
    out.write(SimulationFunction3(args) + `\n`) 

後一種方法說明separation of concerns。你的代碼的每個部分都應該關心做一件事:計算一個值,寫入一個文件或者其他東西。在單個「塊」代碼(函數,類,等等)中執行多項操作會使得難以理解,維護和重用。

有一個地方,我可以有(事實上,可能應該有)在那裏分開的擔憂,並沒有......你能看到它嗎? :-)

+1

僅供參考,如果不存在,''a''將創建一個文件。 – 2015-02-06 02:55:48

+0

@ kindall謝謝!!!!!!! – user32147 2015-02-06 05:31:31

+0

@ kindall非常感謝您爲我提前思考!如果我要將函數調用幾千次,那麼每次打開文件都會影響性能? – user32147 2015-02-06 05:56:35