在實務上,常常有機會需要將資料寫入或讀出檔案,而Python也提供了許多相關的模組(Module)讓開發人員可以容易的進行檔案的操作。
透過本篇的教學,各位除了能夠利用Python進行基本的檔案操作外,也有能力讀取及寫入常見的資料交換格式檔案,重點包含:
- 基本的檔案操作
- JSON檔案操作(JSON Files)
- CSV檔案操作(CSV Files)
- ZIP檔案操作(Zip Files)
一、基本的檔案操作
首先,先來看一下我們目前專案的檔案結構,如下:
現在就來分別介紹幾個Python常用的檔案操作方式:
利用 Path 模組(Module)中的exists()方法,來檢查目錄下是否含有特定的檔案,如下範例:
利用 Path 模組(Module)中的stat()方法即可取得目錄下特定檔案的資訊,如下範例:
執行結果
從執行結果可以看到包含了檔案的大小 st_size、修改時間 st_mtime 及建立時間 st_ctime 等。
利用 Path 模組(Module)中的rename()方法,並且傳入新的檔案名稱及路徑即可實現檔案重新命名的動作,如下範例:
利用 Path 模組(Module)中的write_text()方法,並且傳入要寫入的資料
利用 Path 模組(Module)中的read_text()方法,即可讀取指定目錄中的檔案內容。
在一般的情況下,我們會利用 Path 模組(Module)中的read_text()方法讀取原檔案內容,接著,再透過write_text()方法將資料寫到新檔案中,來達到複製檔案的目的,如下範例:
不過,有一個更簡潔的方式可以達到相同的效果,就是利用 shutil 模組(Module)中的copy()方法,傳入原檔案及新檔案物件,如下範例:
利用open()方法來開啟檔案,接著傳入路徑及模式,而模式分別有 r (讀)、w (覆寫)及 a(續寫)三種,此方法會回傳File Object。另外,關閉檔案則呼叫close()方法,如下範例:
各位可能會覺得奇怪,為什麼這邊讀取檔案內容是呼叫readline()方法而不是read_text()方法?其實,這兩個方法皆可進行讀取檔案內容的動作,只是上面範例是利用 Path 物件的read_text()方法,而這邊是 File 物件的readline()方法。
另外,使用此寫法有一個缺點是,當開啟檔案後,在進行任何動作的過程中,如果有發生例外錯誤時,即有機會沒有執行到關閉檔案的動作,這會使得資源耗盡或導致下次執行時發生錯誤,所以比較好的寫法是使用 with 陳述式( The With Statement),如下範例:
透過with 陳述式(The With Statement),當區塊中的檔案操作結束時,Python會動呼叫close()方法來釋放外部資源。
利用 Path 模組(Module)中的unlink()方法,即可刪除目錄中的檔案。
二、JSON檔案操作(JSON Files)
JSON(JavaScript Object Notation)是一個以JavaScript語法為基礎的輕量資料交換格式,由於容易產生與解析,所以現今許多網站都使用JSON來進行資料的交換。
那Python要如何將應用程式中所產生的JSON格式資料寫入JSON檔案中呢?我們可以利用json模組(Module)中的dumps()方法將資料格式化為JSON,接著再透過 Path 物件的write_text()方法寫入檔案中,如下範例:
而要讀取JSON檔案中的資料,則是先利用Path 物件的read_text()方法讀出來,接著再透過json模組(Module)中的loads()方法將字串資料轉為陣列,最後利用迴圈存取各欄位的資料,如下範例:
三、CSV檔案操作(CSV Files)
CSV(Comma-Separated Values),也是一種資料交換的格式,與JSON不一樣的地方是,每筆資料是以字元符號分隔。
要透過Python將資料寫入CSV檔案中,需引用csv模組(Module),建立CSV writer物件,接著透過writerow()方法寫入資料,如下範例:
另外,要讀取CSV檔案中的內容,則是要建立CSV reader物件,再透過迴圈的方式來存取資料,如下範例:
四、ZIP檔案操作(Zip Files)
還有一個常見的檔案處理就是壓縮,我們可以利用zipfile模組(Module)來建立ZipFile物件,接著利用迴圈,將blog資料夾下的所有檔案,透過write()方法加到壓縮檔中,如下範例:
而解壓縮則是利用原壓縮檔來建立ZipFile物件,接著透過extractall()方法,傳入目的地資料夾名稱來達成,如下範例:
當然,ZipFile物件也提供了取得壓縮檔內容的方法,如下範例:
執行結果
五、小結
以上就是Python在檔案處理中幾個常見的應用,希望透過今天的教學,對於在實務上的應用程式開發有所幫助。在練習的過程中如果有遇到任何問題,歡迎留言分享。