2010-08-04 73 views
3

我正在打開一個CSV文件:python:如果在關閉之前退出,打開的文件會發生什麼?

def get_file(start_file): #opens original file, reads it to array 
    with open(start_file,'rb') as f: 
    data=list(csv.reader(f)) 
    header=data[0] 
    counter=collections.defaultdict(int) 
    for row in data: 
     counter[row[10]]+=1 
    return (data,counter,header) 

確實在內存中的文件的逗留,如果我退出WITH循環內的程序?

當我退出程序時沒有將所有變量設置爲NULL,程序中一般變量會發生什麼變化?

+4

他們終於擺脫了壓迫。 – relet 2010-08-04 16:20:14

+0

「文件是否保留在內存中」這怎麼會發生?你的過程不再存在。 「記憶」在哪裏停留?你在暗示什麼? – 2010-08-04 17:11:45

+0

@ S.Lott:寒意。海報可能還沒有遇到OS管理的流程的較低層次的概念。 – Santa 2010-08-04 17:46:36

回答

8

當您的進程終止時,操作系統將自動關閉任何打開的文件描述符。

存儲在內存中的文件數據(例如變量,Python緩衝區)將會丟失。當文件隱式關閉時,在操作系統中緩衝的數據可能會刷新到磁盤上(儘管不應該依賴它,但在這裏檢查內核髒緩衝區的確切語義是有教育意義的)。

當您的進程終止時,您的變量將不復存在。

+0

進一步詳細說明,當您啓動一個Python「程序」時,操作系統會爲該Python「程序」分配一個進程,由「python.exe」啓動。這個過程爲你的「變量」分配內存和文件描述符。當你「退出」程序時,該進程將被操作系統本身破壞 - 以及其分配的資源。 – Santa 2010-08-04 17:49:08

+0

也許,解釋Python虛擬機的交互操作有點難,因爲它涉及到人們自然而然地認爲是他們的程序(即Python腳本)。 – 2010-08-04 18:05:49

2

只要你的程序終止內存被釋放,你永遠不需要設置變量爲NULL。對於文件也是如此 - 無論是在with循環還是在其他地方退出,它都停留在內存中。但是,手動關閉文件是一種很好的做法,因此您可以確保在退出程序之前執行任何掛起的操作。總的來說,這應該發生,但特別是在寫作時,我通常更喜歡關閉。

5

我對with聲明的理解是,無論如何,當你退出它的範圍時,它會爲你關閉文件句柄。如果您的程序在with區塊內退出,應該仍然會發生。

就其他變量而言,當程序自動退出時,它們會從內存中刪除。如果您有興趣找到在運行之間保持持久性的方法,您可以查看醃菜(http://docs.python.org/library/pickle.html)或擱置(http://docs.python.org/library/shelve.html)模塊。就個人而言,我更喜歡擱置醃泡,但它們都適用於此。

@gotgenes - 謝謝你的建議。需要注意的是,shelve在底層實現中使用pickle。當我說我更喜歡擱置醃菜時,我的意思是,對於我目前使用擱置設計的持久性很重要的方式更容易,因爲它不僅僅是作爲運行之間持續的字典。

+0

鏈接到pickle http://docs.python.org/library/pickle.html和擱置http://docs.python.org/library/shelve.html(請將它們添加到此答案並刪除此評論)。 – gotgenes 2010-08-04 16:31:03

+2

我認爲你應該注意,shelve使用pickle來進行對象序列化。根據您的偏好說明,它們不是兩種不同的序列化方法。 – gotgenes 2010-08-04 16:33:04

相關問題