Python 檔案讀寫

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。

延伸閱讀