三條學習路線

本章 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. 檔案的開啟與關閉openclosewithopen close with…as
4. 文字檔資料的寫入與讀取各種讀寫方式與檔案指標write read readline readlines seek
9. 檔案編碼與 BOM 處理encoding參數、中文亂碼、BOMencoding= 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 argumentwb模式加了encoding10. 二進位檔案的讀寫
IndexError / ZeroDivisionError / ValueError執行階段錯誤5. 例外處理
AssertionError斷言失敗12. traceback 與 assert
寫進檔案的資料不見了忘記close()或沒用with3. 檔案的開啟與關閉

全章重點速記

記住這 10 條

  1. 開檔一律用 with open(…) as f:,離開縮排自動關檔
  2. encoding 要明寫,不要依賴系統預設;讀用UTF-8-sig、寫用UTF-8
  3. 模式:r讀/w覆蓋/a附加;b就是二進位且不能給encoding
  4. 路徑組合用 os.path.join(),不要用字串相加(且後段別以\開頭)
  5. os.rmdir只能刪目錄,非空要用 shutil.rmtree()(不可復原!)
  6. 找檔案用 glob,要走整棵目錄樹用 os.walk(記得join組路徑)
  7. try區塊越小越好,成功才做的事放 else
  8. except順序:子類別在前、Exception最後
  9. 自訂例外繼承 Exception 就好,print(e)即可取得訊息
  10. assert只用於開發階段-O會關掉它),檢查使用者輸入要用if+raise

教材對照

本章內容整理自《Python 自學聖經》:

書上章節頁碼對應筆記
7.2 常用例外錯誤表7-65. 例外處理
7.3 捕捉多個例外7-8 ~ 7-95. 例外處理
7.4 raise 拋出例外7-10 ~ 7-1211. raise 主動拋出例外
7.5 Traceback 記錄字串7-13 ~ 7-1412. traceback 與 assert
7.6 assert 斷言7-15 ~ 7-1712. traceback 與 assert
9.1.1 os 模組9-2 ~ 9-32. 資料夾的建立與刪除
9.1.2 os.path 模組9-4 ~ 9-66. os.path 路徑處理
9.1.3 os.walk 函式9-6 ~ 9-77. os.walk 與 glob 目錄走訪
9.1.4 shutil 模組9-7 ~ 9-88. shutil 檔案與目錄的複製搬移
9.1.5 glob 模組9-97. os.walk 與 glob 目錄走訪
9.2.1 文字檔案的讀寫9-10 ~ 9-133. 檔案的開啟與關閉9. 檔案編碼與 BOM 處理
9.2.2 檔案處理9-14 ~ 9-174. 文字檔資料的寫入與讀取9. 檔案編碼與 BOM 處理
9.3 二進位檔案的讀寫9-1810. 二進位檔案的讀寫

書上兩處已修正的錯誤

整理過程中實測發現書上範例有兩個問題,筆記中已標註並更正:

頁碼問題說明位置
7-16assert speed >= 0 少了 self.,靠全域變數才「剛好」正確12. traceback 與 assert
7-11self.args = arg 會把字串拆成單一字元的 tuple11. raise 主動拋出例外

延伸應用

學完本章後,這些主題會用到檔案與例外處理的觀念: