DSE ICT|Python 檔案處理與例外處理備課指引(導師用)|with open、CSV 讀寫、三類例外與四個常見錯誤
- 2026-11-06
學生寫 open() 之後忘記 close,遇到檔案不存在就整支程式停掉,或者用 except: 把所有錯誤吞掉,之後更難除錯。檔案與例外是同一個習慣的兩面:先講清楚「資源幾時開幾時關」,再講清楚「哪一種錯要接、哪一種錯要讓它爆」。
本堂目標 學生能夠:① 用 with open(…, encoding=”utf-8″) 讀寫文字檔,並講出為何不用手動 close;② 用 csv.reader 逐行讀 240 筆資料、跳過 12 筆不合格記錄(5.0%),只把 228 筆寫入新檔;③ 為三類錯誤(FileNotFoundError、ValueError、ZeroDivisionError)各寫一個精準的 except,並用 else/finally 講清楚成功與收尾的分工。
01 先備知識(開課前 3 分鐘快檢)
以下任何一項未過關,本堂就會卡住,先補該項:
| 技能 | 快檢題 | 過關標準 |
|---|---|---|
| 檔案路徑 | 同一個資料夾內的 data.csv 怎樣寫路徑? | 直接寫 “data.csv”,相對路徑以程式執行位置為準 |
| 字串處理 | 讀入一行 “12,apple,3.5” 要怎樣拆? | 用 split(“,”) 或 csv.reader |
| 型別轉換 | int(“abc”) 會發生甚麼事? | 拋出 ValueError,程式若不接就會中斷 |
02 課堂流程(60 分鐘)
| 時間 | 環節 | 導師做什麼 | 學生做什麼 |
|---|---|---|---|
| 0–6 分 | 爆一次機開場 | 故意讀不存在的檔案,讓程式停掉,問為甚麼 | 講出錯誤名稱 |
| 6–18 分 | with open 與 encoding | 示範讀檔、逐行、rstrip,對比忘記 close 的版本 | 改寫一段讀檔 |
| 18–30 分 | CSV 讀寫與驗證 | 240 筆 → 12 筆不合格 → 228 筆寫入新檔 | 寫出驗證條件 |
| 30–42 分 | 三類例外 | 各示範一個 except,加 else/finally | 為三種錯寫 except |
| 42–56 分 | 除錯演練 | 四段有 bug 的程式,逐段找錯並講原因 | 限時修好兩段 |
| 56–60 分 | 離場檢查 | 三題收回即批,標明錯在資源還是例外 | 獨立完成 |
03 講解腳本(照著說就可以)
第一幕:with open 是資源習慣,不是語法裝飾
學生寫 f = open(…) 之後直接做其他事,檔案沒關,Windows 上再開同一個檔就會失敗,而學生只會覺得「電腦壞了」。要講清楚 with 的價值:區塊一結束就自動 close,即使中途出錯都會關。再加 encoding=”utf-8″,否則中文資料在不同機器會變亂碼或直接拋 UnicodeDecodeError。
板書只留兩行對照:with 版本三行寫完、手動版本六行還要 try/finally 才安全。讓學生自己數行數,比講道理快。
板書只留兩行對照:with 版本三行寫完、手動版本六行還要 try/finally 才安全。讓學生自己數行數,比講道理快。
要學生做:把一段手動 open/close 的程式改寫成 with 版本,並講出多了甚麼保障。
第二幕:讀檔要逐行,驗證後才寫入
學生的做法通常是 read() 一次讀全部再 split,遇到大檔就爆記憶體,而且一有壞行就整批失敗。正確流程是三段:讀、驗、寫。讀:for row in csv.reader(f) 逐行處理;驗:檢查欄數與數值(例如分數必須 0 至 100);寫:只把合格的 228 筆 append 到新檔。
用 240 筆資料、12 筆不合格(5.0%)做例子,讓學生先算出合格率 95.0%,再寫 if 條件,數字先算後寫,條件就不會寫反。
用 240 筆資料、12 筆不合格(5.0%)做例子,讓學生先算出合格率 95.0%,再寫 if 條件,數字先算後寫,條件就不會寫反。
要學生做:寫出驗證條件,並講出為何不合格的 12 筆不可以直接丟掉而要記錄。
第三幕:except 要精準,否則錯誤會被吞掉
學生最愛寫 except: 或 except Exception: pass,程式不再爆,但資料錯了也無人知。教法是三類錯誤各寫一個具名 except,並且用 else 講成功、finally 講收尾。FileNotFoundError 是路徑問題(要提示用戶檢查檔名);ValueError 是資料問題(要記錄行號並跳過該行);ZeroDivisionError 是邏輯問題(要先判斷除數是否為 0)。
再補一句規則:能修的錯才接,不能修的錯要讓它爆,這樣 traceback 才會指出真正的行號。
再補一句規則:能修的錯才接,不能修的錯要讓它爆,這樣 traceback 才會指出真正的行號。
要學生做:為三段錯誤程式各寫一個具名 except,並說明為何必不可用空白 except。
04 必教題型與步驟
| 題型 | 例子 | 步驟 | 答案 |
|---|---|---|---|
| 讀檔統計題 | 讀 data.csv 計平均分 | with open + csv.reader → 累加 → 除以有效筆數 | 要處理空行與非數值欄 |
| 例外判定題 | 問這段程式拋哪個例外 | 看是哪一行、哪個型別轉換失敗 | 答案要寫例外名稱+行號 |
| 寫入模式題 | 分辨 w 與 a | w 清空重寫、a 追加 | 要講出覆蓋的後果 |
| 除錯題 | 找四段程式的錯 | 按資源、編碼、驗證、例外四類順序查 | 每段要指出錯因與修法 |
合理性檢查(一定要教):合理性檢查:全堂只圍繞一個資料檔(240 筆、12 筆不合格),避免例子過多;每個 except 必須具名,出現空白 except 即扣分;寫入前一定要先驗證,並且保留不合格記錄的日誌;示範要包含「忘記 close 導致第二次開檔失敗」與「except pass 令錯誤隱形」兩個真實後果,學生才會覺得規矩有用。
05 獨立練習三題
| 題目 | 答案 | 想觀察什麼 |
|---|---|---|
| 讀檔改造 | 把手動 open/close 改成 with 版本 | 看是否加了 encoding |
| 驗證寫入 | 240 筆中篩出 228 筆寫入新檔 | 看合格率是否算對、壞行有沒有記錄 |
| 三類例外 | 為三段程式各寫具名 except | 看是否仍出現空白 except |
06 學生常見錯誤與糾正句
| 錯誤 | 學生通常這樣寫 | 導師這樣說 |
|---|---|---|
| 忘記關檔 | f = open(…) 之後沒有 close | 「你第二次開同一個檔就失敗,係因為第一個仲鎖住。用 with,佢自己會關。」 |
| 空白 except | except: pass 當成萬能 | 「你接咗錯但唔知錯咩,下次資料錯都無人發現。要寫明係邊一種錯。」 |
| 用 w 想追加 | 想加一行就用 open(…, “w”) | 「w 會清空成個檔,你原本 228 筆冇晒。要加就用 a。」 |
| 冇 encoding | open(“data.csv”) 讀中文變亂碼 | 「加 encoding=”utf-8″,唔係換部電腦就讀唔到。」 |
07 家課建議(直接指到練習卷題號)
- 中學 ICT 章節索引 全科章節一覽
- 備課指引總索引 其他科目的同類章節
- 本章重做 重做 Exercise B:Q1–Q3(讀檔統計)、Q4–Q5(例外判定)、Q6(除錯)
08 離場檢查(最後 5 分鐘)
| 題目 | 答案 | 判定 |
|---|---|---|
| with open | 自動關檔+encoding | 講不出為何要 encoding=回到第二幕 |
| 驗證寫入 | 先驗後寫,壞行記錄 | 答「讀完直接寫」=重講第二幕 |
| 三類例外 | FileNotFound/Value/ZeroDivision | 仍寫空白 except=回到第三幕 |
09 導師常問
一定要用 csv 模組嗎?
不一定,split(“,”) 也可以,但遇到引號內有逗號就會錯,csv 模組較穩。
要用 pandas 嗎?
DSE 課程不需要,用內建 csv 已足夠,亦較易在紙上寫。
例外要背幾多個?
三個核心就夠:找不到檔、數值格式錯、除以零,其餘可以查。
本頁為 TutorZone 導師備課指引,內容由 TutorZone 團隊編寫;題目與流程為原創,並非任何學校或出版社的教材。


