1. 程式人生 > 其它 >Python with語句和上下文管理器

Python with語句和上下文管理器

 

open("FishC.txt","w")#此處需注意如果被開啟的檔案中,已有內容,那麼用w的方式開啟,則會導致原檔案內容被截斷,也就是相當於被清空了;然後重新寫入的意思。然後我們把開啟後產生的檔案物件賦值給 f 變數。

然後我們把呼叫檔案物件 f 的write方法來寫入一個字串。其返回的是寫入的字元個數。最後要記得把開啟的檔案物件關閉;這樣你寫入的內容才能真的寫入進去,才能真正的儲存下來。如下圖所示。

 

 

 

總結起來就是3步:開啟檔案,操作檔案,關閉檔案。

如果我們使用with上下文管理器方案的實現如下:
with open("FishC.txt","w") as f:

      f.write("Li Jin-Tao,the President !")

用with實現檔案操作,你就不需要額外地寫f.close()來關閉檔案了。用了with其內含了這個操作。

對於檔案操作這樣的3步來說 ,上文就是開啟檔案,下文就是關閉檔案,這就是上下文管理器做的事情,使用了上下文管理器,我們就不需要手動的關閉檔案,檔案處理的程式碼只需要放到with語句的縮排裡面就可以了。

另外,千萬不要以為with語句是個花瓶,使用上下文管理器最大的優勢是能夠確保資源的釋放。在這裡就是檔案的正常關閉。with會幫你關閉 。

在函式主體內的程式碼塊出現問題時,比如1/0這樣的問題,如果你使用普通的f.close(),那麼你想寫入檔案的內容,在報錯的同時,不會真的寫到檔案中去。而如果你不用with語句,則在報錯的同時,會寫入到檔案中去。

pickle:泡菜,Python物件序列化的第一個。其解決的是一個永久儲存Python物件的問題;它允許你將字串、列表、字典等這些Python物件,給儲存為檔案的形式。有人就問.py檔案不就是儲存為檔案的形式了嗎?不對,.py檔案時打包的原始碼,是可以被執行的獨立單元;而這個pickle則是在模組時很有用處,。此處講的是將Python物件序列化的操作。序列化也就是將Python物件轉換為2進位制位元組流的過程;也即將人能看得懂的原始碼轉換成0110這樣的二進位制組合。要注意兩個函式:dump和load。

可看到下圖中的變數既有整型變數,也有列表、字串和字典;這些都是Python的物件。

想要使用pickle就要先匯入它,import pickle

要儲存為pickle檔案,那麼字尾必須為pkl,名字隨便取,且開啟時必須用2進位制的形式開啟,此處用2進位制可寫入的形式開啟。

然後再函式體中用pickle.dump(x,f)的形式,把x寫入f中去。如下圖所示:

 

 

然後,你可看到已經生成了data.pkl檔案,用sublime、notepad++、editplus等軟體開啟可看到裡面都是二進位制檔案。如下圖所示:

 

 

如果你用文字檔案開啟這個檔案的話,那麼你看到的是一堆亂碼。

那麼我們下面編寫一個read.py的Python檔案,來讀取這個二進位制程式碼,如下所示,修改下上面的write.py檔案即可實現;需要用到pickle.load()函式,並傳入要讀取的檔案。如下圖所示,之前我們以什麼順序存進去的,現在就是以什麼順序讀出來。

其中,下圖中 x=pickle.load(f)的變數名x,你根據需要可以隨便取名。讀出的物件型別就是我們存進去的物件型別 。

 

然後可以看到原來寫入的內容就讀取出來了,如下圖所示。

 

你可能覺得寫了那麼多的dump或load太麻煩了;其實你可以這麼做,用元組的方式把它們給打包起來。

這樣你要在寫入和讀取時都要用對應的方法即可。如下兩個圖所示,分別為寫入和讀取時都用同樣的方式。

        

 

可看到得到的結果是一樣的。