Python學習之路9-文件和異常

本系列是對入門書籍《Python編程:從入門到實踐》的筆記整理,屬於初級內容。標題順序採用書中標題。

本章主要是學習Python的文件操作,主要是從文件中讀取數據以及將數據存儲到文件中,還有錯誤處理,異常類,json模塊等。

從文件中讀數據

讀取整個文件

以下文件pi_digits.txt包含了精確到小數點後30位的圓周率數據:

Python學習之路9-文件和異常

從上述代碼可以看出,我們打開文件使用open()函數,該函數至少接收一個參數,即文件路徑。讀取文件時需要向open()函數指明是用什麼方式讀取文件,是只讀("r")只寫(“w”)末尾添加(“a”)還是讀寫均可(“r+”)open()函數默認以“只讀”方式讀取文件。這只是4中常用的文件讀取方式,此外還有至少8種讀寫方式。open()函數返回一個文件對象,file_object用於接收該對象。通過文件對象的read()方法讀取文件內容,且該方法返回整個文件的內容。

上述代碼中的文件和源代碼在同一目錄中。注意文件路徑的問題,絕對路徑(不提倡)和相對路徑(相對於源文件的路徑)以及Windows和Linux下路徑的寫法。

注意代碼中的with關鍵字。其實讀寫文件不需要該關鍵字,打開文件使用open()函數,文件讀取完後關閉文件使用close()函數,讀取內容可以調用read()方法。而之所以使用with關鍵字,主要是因為①你最後忘記關閉文件,就想忘了關燈一樣;②也可能是在關閉前程序出錯,導致close()語句未執行。這些讓文件沒有關閉的情況都有可能導致數據丟失或損壞。with關鍵字則被用來應對這些情況,它保證在結束with塊時,文件一定會被關閉。

逐行讀取

上述代碼一次性讀取整個文件,這在文件較小或者內存充裕的時候沒有問題,但如果文件特別大,內存容量又很羞澀,則只能逐行讀取:

Python學習之路9-文件和異常

這裡需要注意一個問題,就是對行以及文件末尾空字符的讀取問題,read()readline()方法會讀取末尾的空字符(這裡是換行符)。我們可以通過之前講的rstrip()方法去掉末尾的空字符。

將文件每一行放入列表中

readlines()方法將文件中每一行存入列表並返回,以下代碼進一步處理文件中的內容:

Python學習之路9-文件和異常

注意,Python從文件中讀取出的所有內容都是字符串,如果你想要的是數字,請記得轉換。

寫入文件

以下是一個簡單的文件寫入程序:

Python學習之路9-文件和異常

執行改代碼後你會看到在同一目錄下會生成一個名為“python.txt”的文件。需要注意的是,以"w"方式打開文件,如果要寫入的文件不存在,則會自動創建該文件;如果該文件存在,該文件的內容會被清空,然後再寫入。如果不想文件被清空,請使用

"a"(文件指針放在文件末尾)或"r+"(文件指針指向文件開頭)方式打開文件。還有一點,write()函數不會在文件末尾添加換行符,如果需要換行符,請自行添加。

異常

Python中使用被稱為異常的特殊對象來管理程序執行期間發生的錯誤。每當代碼運行時如果遇到了不能處理的錯誤,Python都會創建一個異常對象,如果程序中沒有處理該對象的相關代碼,程序將會停止,並顯示一個traceback,其中包含異常的相關報告。如果不想程序因為某些異常而終止運行,則需要我們使用try-except代碼塊自行處理異常。以下是一個處理除零錯誤ZeroDivisionError的例子:

Python學習之路9-文件和異常

如果你打算編寫一個計算器應用,那麼這段代碼必不可少。第一個例子表明,即使發生了異常,只要異常被我們捕捉,那麼程序便不會終止。如果只想捕捉異常,但暫時又不想處理,可以將上述的print("You can't divide by zero!\n")替換為pass語句。如果想捕獲所有的異常,則except後面不指定異常類型。

else代碼塊

try-except代碼塊還可以和else語句組合形成try-except-else代碼塊,該結構表示,如果捕獲了異常,這執行except中的程序,沒有發生異常則執行else中的程序。以下程序是一個循環統計文件中單詞數的例子,文件讀取的部分被放到了函數中,該函數檢測有沒有發生FileNotFoundError

Python學習之路9-文件和異常

對else的補充:其實else不光可以和iftry-except結合,還可以和for循環和while循環結合,比如:

Python學習之路9-文件和異常

這裡的

else表示當循環結束後執行一些語句,比如提示之類的。

決定報告哪些錯誤

編寫得很好且經過詳盡測試的代碼不容易出現內部錯誤,如語法或邏輯錯誤,但只要程序依賴於外部因素,如用戶輸入、存在指定的文件、有網絡連接等,就有可能出現異常。憑經驗可判斷改在程序的什麼地方包含異常處理塊,以及出現錯誤時該向用戶提供多少相關的信息。

存儲數據

很多程序要求用戶輸入某種信息,也有可能程序中某些變量的數據在程序結束後不能丟失(比如機器學習最後訓練出來的模型參數),這是就需要將這些信息以文件的形式存下來。存儲數據的方式有很多,現在比較簡單且通用的是使用json來存儲信息。json(JavaScript Object Notation)格式最初是為JavaScript 開發的,但隨後成了一種常見格式,並被包括Python在內的眾多語言採用。以下是一個經過了重構的存儲用戶信息的例子:

Python學習之路9-文件和異常

代碼就不運行了,請各位自行推導程序的結果。最後在username.json文件中會存有用戶的信息。但要注意一點,json根據數據類型來存儲數據,雖然最後都是字符串,但這個過程不需要我們干預,比如要存一個列表,並不需要我們先將其轉換為字符串,再存入json,讀取數據時也不需要我們先讀取為字符串,再轉換成列表,我們只需直接存取即可,轉換工作由json模塊自動完成。


分享到:


相關文章: