Python 檔案讀寫(Python File Handling)
這篇 Python open 教學將帶你讀寫檔案:程式處理的資料總得有地方來、有地方去。本篇特別處理台灣使用者的頭號痛點——Windows 預設編碼 cp950 造成的中文亂碼與 UnicodeDecodeError,記住一條鐵則就能避開:開檔永遠指定 encoding="utf-8"。
with open 基本語法
with open("檔名", "模式", encoding="utf-8") as f:
操作 f
with 區塊結束時自動關閉檔案,不用(也不該)手動 close()。模式一覽:
| 模式 | 意義 | 檔案不存在時 |
|---|---|---|
"r" | 讀取(預設) | 報 FileNotFoundError |
"w" | 寫入(清空重寫) | 自動建立 |
"a" | 附加到結尾 | 自動建立 |
"x" | 建立新檔寫入 | —(已存在反而報錯) |
寫入檔案
with open("notes.txt", "w", encoding="utf-8") as f:
f.write("第一行筆記\n")
f.write("第二行筆記\n")
print("寫入完成")
執行輸出:
寫入完成
注意 write() 不會自動換行,要自己加 \n。小心 "w" 模式——檔案已存在會整個清空,要保留舊內容用 "a"。
讀取檔案
三種讀法依需求選擇:
# 一次全部讀進來(小檔案)
with open("notes.txt", "r", encoding="utf-8") as f:
content = f.read()
print(content, end="")
# 逐行處理(大檔案標準寫法,不會塞爆記憶體)
with open("notes.txt", "r", encoding="utf-8") as f:
for line in f:
print("讀到:", line.strip()) # strip 去掉行尾換行
執行輸出:
第一行筆記
第二行筆記
讀到: 第一行筆記
讀到: 第二行筆記
另外 f.readlines() 把每行收進 List,適合需要行數或索引的情況。
附加模式與實例:簡易日誌
def write_log(message):
with open("app.log", "a", encoding="utf-8") as f:
f.write(f"{message}\n")
write_log("程式啟動")
write_log("使用者登入")
with open("app.log", "r", encoding="utf-8") as f:
print(f.read(), end="")
執行輸出:
程式啟動
使用者登入
台灣痛點:cp950 與 UTF-8
Windows 的記事本、舊系統匯出的檔案常是 cp950(Big5)編碼,Python 在 Windows 上 open() 沒指定 encoding 時也可能用 cp950 開檔——兩邊不一致就出事:
# 檔案是 UTF-8,卻用 cp950 讀
with open("notes.txt", "r", encoding="cp950") as f:
print(f.read())
執行輸出:
UnicodeDecodeError: 'cp950' codec can't decode byte 0xb8 in position 4: illegal multibyte sequence
對策整理:
| 情況 | 做法 |
|---|---|
| 自己建立的檔案 | 一律 encoding="utf-8" 讀寫,沒有例外 |
| 拿到舊系統/Excel 匯出的檔案 | 試 encoding="cp950" 讀取 |
| 不確定編碼 | 先用 cp950 試,錯了換 utf-8(或反過來) |
常見錯誤
1. FileNotFoundError: No such file or directory
讀取的檔案不存在,或工作目錄不是你以為的位置(相對路徑是相對「執行指令的位置」,不是 .py 檔的位置)。搭配 try except 處理,或用絕對路徑。
2. UnicodeDecodeError
編碼不一致,如上節。先確認檔案實際編碼再指定對的 encoding。
3. 用 “w” 模式誤刪整個檔案
開檔瞬間就清空了,跟有沒有 write 無關。要附加用 "a",怕覆蓋用 "x"。
總結
開檔標準式:with open(path, mode, encoding="utf-8") as f;讀小檔用 read()、大檔逐行 for line in f;"w" 清空、"a" 附加;編碼鐵則「永遠指定 utf-8,除非確定對方是 cp950」。下一篇處理兩種最常見的結構化檔案:JSON 與 CSV。