1、with基於上下文,會自動幫助我們關閉文件。
如果不關閉文件,會怎么樣?對於在個人電腦上沒什么影響。如果你執行的python程序結束了,文件會自動關閉。
服務器端如果不關閉文件,會出現句柄泄露,導致句柄耗盡。
2、對於linux系統,每次做一件事,就會打開一個文件,進行讀,寫。。。等操作,然后關掉。但是打開的文件在linux系統有一個上限,不能打開過多的文件,上限是65535個文件。
服務器端開的文件一般是不關閉的,服務器的進程不會自己結束掉的。如果打開的文件個數超過65535個,就會出現句柄耗盡,其他linux所有的文件都被卡死了。這個時候打開文件會發現操作系統沒有可用的句柄了。所以不關閉文件一般對服務器端有限制。
3、文件如果沒有關閉,會導致你寫入的內容,沒有真正寫到磁盤上;
不關文件是否可以讓文件的內容實時寫入磁盤里面,而不是最后等到關閉文件才寫入?
答案是可以的。可以使用flush()配合open()來實現。經驗證,flush()之前是沒有寫入的,flush()之后數據寫入文件了。
flush就是實時刷新,把你寫入的文件內容寫到磁盤里。Windows之所以會有這種機制,是因為如果每寫入幾個字符就要操作一次IO的話,對磁盤的壓力會特別大。
而flush()之后再輸入的數據就沒有被寫入文件中。
知識補充:
句柄當做一個人的名字,並"可以通過名字(句柄),實現對句子的引用和訪問", 感覺這種比喻好象貼近,但問題是可能有許多人叫同一個名字,但句柄之所以有意義正因為它具有唯一性,所以這種比喻也有問題。
如果換個說法,說句柄是表示你的進程與外界的i/o連接,把它當作是一個連接的名字是不是更恰當些?
文件句柄是一個十六位長度的二進制代碼(Windows95后為32位無符號整 數),代表一個已被打開文件的通道號,借助於這個句柄,你的應用程序即可使用這個相應的句柄對文件進行隨意存取操作,說白了文件句柄其實是一串代表着特殊含義的號碼;
當然其實系統是用句柄與一些資源聯系起來的,當由系統管理,動態分配給你應用程序的某些資源的代號,你就可以使用句柄訪問相應的資源了,尤其在Windows系統中,有很多東西都使用句柄,如窗口,socket。
句柄泄露示例,參考:https://www.cnblogs.com/wendiyou/p/11372666.html