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