2017-03-23 74 views
0

下面是我編寫的一個腳本的一部分,它將列表中的每個項目傳遞給一個函數,將該函數的輸出存儲爲帶有換行符的變量結束,然後將變量寫入文件中的新行。它還將變量輸出到控制檯。在python中的for循環中寫入文件

for i in lane_list: 
     out = count_genes(count, i, reader, total_genes) + '\n' 
     count += 1 
     outfile.write(out) 
     print out 

該腳本的作品,但不是我期望的方式。當腳本運行時,我可以看到輸出打印到控制檯,所以我知道腳本通過for循環運行的速度,並且我認爲python會以與輸出到控制檯相同的速率寫入文件。奇怪的是,很長一段時間沒有任何東西會寫入文件(我可以通過在控制檯中'將文件'作爲腳本的運行''來看到這一點),然後再一次在文件中出現幾百行。就好像python正在存儲要寫入文件一段時間的內容,然後一次性寫入所有內容。更令人驚訝的是,當我捕捉文件時,有時候運行它的腳本將寫入最後一行的一半,但不是全部。

任何人都可以向我解釋爲什麼這是?

+4

閱讀關於flushing:http://stackoverflow.com/questions/3167494/how-often-does-python-flush-to-a-file。另外使用'tail -f filename'來獲得文件的實時預覽可能會有幫助(如果你正在使用linux)。 – szymon

回答

1

正如@szymon提到的那樣,文件在寫入時被緩衝。如果你想看到它被寫入'live',請使用open('/path/to/file'', 'w', 0),其中0 means unbuffered

對於python3使用1作爲線路緩衝,因爲無緩衝僅允許用於二進制數據。

+0

謝謝大家,有沒有什麼理由不使用這個?它會減速嗎? –

+0

它可以減慢速度 - 每次保存到文件時它都會觸發磁盤(I/O操作)。當設置緩衝區大小時,腳本僅在緩衝區滿時刷新磁盤(並刷新它)。 – szymon