前面說過,f=open,它涉及到兩方面的資源,一方面是這個(gè)變量所占的內(nèi)存空間,這個(gè)內(nèi)存空間我們要進(jìn)行回收,就直接del f就可以了。
del f
它是解除變量名f與它對(duì)應(yīng)的值的綁定關(guān)系,這樣這個(gè)變量值就變成了垃圾,被垃圾回收機(jī)制回收了。
這是回收應(yīng)用程序的資源。
然后還有一方面就是操作系統(tǒng)打開的這個(gè)具體的文件所占的內(nèi)存空間,這個(gè)內(nèi)存空間我們也要進(jìn)行回收,如果我們不回收,操作系統(tǒng)就會(huì)一直維護(hù)著打開的這個(gè)文件。
所以我們還要干一件事,就是f.close()。
f.close()
這是在操作f這個(gè)文件對(duì)象,這也就相當(dāng)于向操作系統(tǒng)發(fā)出請(qǐng)求,讓操作系統(tǒng)把剛剛打開的這個(gè)文件關(guān)掉,這是回收操作系統(tǒng)的資源。
但是我們這樣寫的話就會(huì)有一個(gè)問題,我們前面已經(jīng)用了del解除了f和變量值的綁定關(guān)系了,這個(gè)文件對(duì)象已經(jīng)被回收了。
后面又要用到f來調(diào)用這個(gè)close()這個(gè)功能,很明顯這樣是調(diào)用不到的,所以我們要在這個(gè)變量還在的時(shí)候就告訴操作系統(tǒng),讓操作系統(tǒng)幫我們把這個(gè)文件關(guān)掉。
然后再del f。
f.close()
del f
但是通常我們不會(huì)主動(dòng)來做這一步,你會(huì)發(fā)現(xiàn)前面寫程序,也沒有說定義了一個(gè)變量,然后后面不用了再把它del一下。
這一步不用自己來做,交給python的垃圾回收機(jī)制就可以了。
現(xiàn)在我只是給你們講原理。
f這個(gè)文件對(duì)象所占的內(nèi)存空間,其實(shí)也就跟我們前面正常定義一個(gè)整型變量1、24、100所占的內(nèi)存空間都差不多。
我們后面把這個(gè)f用在其他地方的時(shí)候,這個(gè)值自然也就被回收了。
所以我們后面寫程序的時(shí)候,不用考慮應(yīng)用程序的資源回收問題,只需要考慮操作系統(tǒng)的資源回收問題就好了。
因?yàn)椴僮飨到y(tǒng)的資源回收問題,python的垃圾回收機(jī)制管不了,而且操作系統(tǒng)能夠同時(shí)打開的問價(jià)數(shù)量也是有限的。
當(dāng)然我們以后做一些比較大型的項(xiàng)目的話,我們會(huì)把操作系統(tǒng)的限制改大一些,因?yàn)槟愕牟僮飨到y(tǒng)再被大量用戶同時(shí)訪問的時(shí)候,很多用戶都涉及到操作你的硬盤,打開你的文件。
這樣就會(huì)有問題,你的操作系統(tǒng)可能會(huì)同時(shí)打開幾千幾萬個(gè)文件,這時(shí)候你的應(yīng)用程序性能將就下降了。
這時(shí)候很多用戶可能就訪問不到你的資源了。
當(dāng)然操作系統(tǒng)的限制改大也不是無限改大的。
如果你就是頭鐵,不想關(guān)閉文件,操作系統(tǒng)就會(huì)過一段時(shí)間掃描一遍,看看有沒有不用的文件,然后它也會(huì)幫你關(guān)掉。
但是這個(gè)文件在被操作系統(tǒng)主動(dòng)關(guān)閉之前,它對(duì)電腦的性能也是一種消耗。
所以關(guān)閉文件這一步非常重要。
現(xiàn)在我們來運(yùn)行一下。
f = open('date/a.txt', mode='rt') # 相對(duì)路徑
res = f.read()
print(res)
f.close()
del f
打印出來好像是亂碼了,這個(gè)問題很好解決,根據(jù)前面我們學(xué)過的字符編碼知識(shí),知道這只要指定字符編碼就能解決的。
未經(jīng)允許不得轉(zhuǎn)載:445IT之家 » 零基礎(chǔ)Python到全棧-關(guān)閉文件