三條學習路線
本章 12 篇筆記可以分成三條線,彼此獨立又互相支援:
┌─ A 檔案系統操作(目錄與路徑)────────────────────────┐
│ 1 檔案概論 → 2 資料夾建立刪除 → 6 os.path 路徑 │
│ → 7 os.walk / glob → 8 shutil │
└──────────────────────────────────────────────────────┘
┌─ B 檔案讀寫(內容處理)──────────────────────────────┐
│ 3 開啟與關閉 → 4 文字檔讀寫 → 9 編碼與 BOM │
│ → 10 二進位檔案 │
└──────────────────────────────────────────────────────┘
┌─ C 例外處理(錯誤防護)──────────────────────────────┐
│ 5 例外處理 → 11 raise 拋出 → 12 traceback / assert │
└──────────────────────────────────────────────────────┘
建議順序
先 B 再 A 最後 C。先學會讀寫單一檔案(最直覺),再處理目錄與路徑,最後補上錯誤防護。
若是為了做專題,A 和 B 學完就夠用了,C 可以邊做邊查。
全部筆記一覽
A|檔案系統操作
| 筆記 | 內容 | 關鍵函式 |
|---|---|---|
| 1. 檔案概論 | 檔案與資料夾的基本概念 | — |
| 2. 資料夾的建立與刪除 | 檢查存在、建立與刪除目錄 | isdir isfile exists mkdir rmdir getcwd remove system |
| 6. os.path 路徑處理 | 路徑的取得、分解與組合 | abspath basename dirname split join getsize |
| 7. os.walk 與 glob 目錄走訪 | 走訪整棵目錄樹、萬用字元搜尋 | os.walk glob.glob |
| 8. shutil 檔案與目錄的複製搬移 | 跨平台的複製、搬移、遞迴刪除 | copy copytree rmtree move |
B|檔案讀寫
| 筆記 | 內容 | 關鍵函式 |
|---|---|---|
| 3. 檔案的開啟與關閉 | open/close/with | open close with…as |
| 4. 文字檔資料的寫入與讀取 | 各種讀寫方式與檔案指標 | write read readline readlines seek |
| 9. 檔案編碼與 BOM 處理 | encoding參數、中文亂碼、BOM | encoding= UTF-8-sig |
| 10. 二進位檔案的讀寫 | 圖片、聲音等非文字檔 | rb wb encode decode |
C|例外處理
| 筆記 | 內容 | 關鍵語法 |
|---|---|---|
| 5. 例外處理 | 被動捕捉錯誤、例外類別表 | try except else finally |
| 11. raise 主動拋出例外 | 主動拋出內建或自訂例外 | raise class MyError(Exception) |
| 12. traceback 與 assert | 記錄錯誤過程、開發階段斷言 | traceback.format_exc() assert |
我想做什麼?(任務導向查找)
| 我想… | 看這篇 |
|---|---|
| 檢查檔案/資料夾存不存在 | 2. 資料夾的建立與刪除 |
| 取得目前程式所在的目錄 | 6. os.path 路徑處理(dirname(__file__)) |
| 把路徑和檔名組合起來 | 6. os.path 路徑處理(join) |
| 查檔案大小 | 6. os.path 路徑處理(getsize) |
| 找出資料夾裡所有的 .txt 檔 | 7. os.walk 與 glob 目錄走訪(glob) |
| 處理子目錄裡的每一個檔案 | 7. os.walk 與 glob 目錄走訪(os.walk) |
| 複製檔案或整個資料夾 | 8. shutil 檔案與目錄的複製搬移 |
| 刪除非空的資料夾 | 8. shutil 檔案與目錄的複製搬移(rmtree) |
| 讀出文字檔內容 | 4. 文字檔資料的寫入與讀取 |
| 把資料寫入檔案(不要覆蓋舊的) | 4. 文字檔資料的寫入與讀取('a'模式) |
| 解決中文亂碼 | 9. 檔案編碼與 BOM 處理 |
| 讀寫圖片檔 | 10. 二進位檔案的讀寫 |
| 讓程式出錯不中斷 | 5. 例外處理 |
| 資料不合理時主動報錯 | 11. raise 主動拋出例外 |
| 把錯誤寫進 log 檔 | 12. traceback 與 assert |
常見錯誤 → 去哪裡找答案
| 錯誤訊息 | 原因 | 看這篇 |
|---|---|---|
FileNotFoundError | 檔案不存在或路徑錯 | 3. 檔案的開啟與關閉、6. os.path 路徑處理 |
OSError: 目錄不是空的 | os.rmdir只能刪空目錄 | 8. shutil 檔案與目錄的複製搬移 |
FileExistsError | 目錄已存在還要建立 | 2. 資料夾的建立與刪除 |
UnicodeDecodeError | 讀檔編碼不符 | 9. 檔案編碼與 BOM 處理 |
UnicodeEncodeError | 寫檔編碼不支援該字元 | 9. 檔案編碼與 BOM 處理 |
| 字串比對永遠不成立、看起來卻正常 | BOM 作祟 | 9. 檔案編碼與 BOM 處理 |
TypeError: a bytes-like object is required | 二進位模式寫入字串 | 10. 二進位檔案的讀寫 |
binary mode doesn't take an encoding argument | wb模式加了encoding | 10. 二進位檔案的讀寫 |
IndexError / ZeroDivisionError / ValueError | 執行階段錯誤 | 5. 例外處理 |
AssertionError | 斷言失敗 | 12. traceback 與 assert |
| 寫進檔案的資料不見了 | 忘記close()或沒用with | 3. 檔案的開啟與關閉 |
全章重點速記
記住這 10 條
- 開檔一律用
with open(…) as f:,離開縮排自動關檔encoding要明寫,不要依賴系統預設;讀用UTF-8-sig、寫用UTF-8- 模式:
r讀/w覆蓋/a附加;加b就是二進位且不能給encoding- 路徑組合用
os.path.join(),不要用字串相加(且後段別以\開頭)os.rmdir只能刪空目錄,非空要用shutil.rmtree()(不可復原!)- 找檔案用
glob,要走整棵目錄樹用os.walk(記得join組路徑)try區塊越小越好,成功才做的事放elseexcept順序:子類別在前、Exception最後- 自訂例外繼承
Exception就好,print(e)即可取得訊息assert只用於開發階段(-O會關掉它),檢查使用者輸入要用if+raise
教材對照
本章內容整理自《Python 自學聖經》:
| 書上章節 | 頁碼 | 對應筆記 |
|---|---|---|
| 7.2 常用例外錯誤表 | 7-6 | 5. 例外處理 |
| 7.3 捕捉多個例外 | 7-8 ~ 7-9 | 5. 例外處理 |
| 7.4 raise 拋出例外 | 7-10 ~ 7-12 | 11. raise 主動拋出例外 |
| 7.5 Traceback 記錄字串 | 7-13 ~ 7-14 | 12. traceback 與 assert |
| 7.6 assert 斷言 | 7-15 ~ 7-17 | 12. traceback 與 assert |
| 9.1.1 os 模組 | 9-2 ~ 9-3 | 2. 資料夾的建立與刪除 |
| 9.1.2 os.path 模組 | 9-4 ~ 9-6 | 6. os.path 路徑處理 |
| 9.1.3 os.walk 函式 | 9-6 ~ 9-7 | 7. os.walk 與 glob 目錄走訪 |
| 9.1.4 shutil 模組 | 9-7 ~ 9-8 | 8. shutil 檔案與目錄的複製搬移 |
| 9.1.5 glob 模組 | 9-9 | 7. os.walk 與 glob 目錄走訪 |
| 9.2.1 文字檔案的讀寫 | 9-10 ~ 9-13 | 3. 檔案的開啟與關閉、9. 檔案編碼與 BOM 處理 |
| 9.2.2 檔案處理 | 9-14 ~ 9-17 | 4. 文字檔資料的寫入與讀取、9. 檔案編碼與 BOM 處理 |
| 9.3 二進位檔案的讀寫 | 9-18 | 10. 二進位檔案的讀寫 |
書上兩處已修正的錯誤
整理過程中實測發現書上範例有兩個問題,筆記中已標註並更正:
頁碼 問題 說明位置 7-16 assert speed >= 0少了self.,靠全域變數才「剛好」正確12. traceback 與 assert 7-11 self.args = arg會把字串拆成單一字元的 tuple11. raise 主動拋出例外
延伸應用
學完本章後,這些主題會用到檔案與例外處理的觀念:
- 1. MYSQL 資料庫連線:資料庫操作的例外處理與交易復原
- 1. 物件導向程式開發:自訂例外類別、
__del__解構式釋放資源