Skip to content

Python 文件處理

在任何編程語言中,處理檔案都是一項基礎且重要的技能。無論是讀取設定檔、處理用戶上傳的數據,還是將程式運行的結果保存下來,你都離不開檔案輸入/輸出 (File I/O) 操作。Python 提供了強大而簡潔的工具來處理檔案,讓這項工作變得非常直觀。

這篇文章將帶你學習 Python 檔案處理的基礎知識,從理解 File Object 和檔案串流 (Stream) 開始,到實際操作文字檔和二進位檔案。你將學會如何管理檔案和資料夾,以及如何優雅地處理可能發生的錯誤。

📜 什麼是 File Object 和 File Stream?

在 Python 中,當你打開一個檔案時,你會得到一個 File Object。這個 Object 是 Python 對檔案系統中實際檔案的一個抽象表示,它包含了檔案的各種屬性(如名稱、模式等)和可用於操作檔案的方法(如讀取、寫入等)。

File Stream (檔案串流) 則是指數據流動的通道。想像一下,數據就像水流一樣,可以從你的程式「流入」檔案(寫入),也可以從檔案「流出」到你的程式(讀取)。根據處理的數據類型,Python 的 io 模組將串流主要分為三種類型:

  1. 文字 I/O (Text I/O):處理 str (字串) Object。這是最常見的類型,用於讀寫文字檔。它會自動處理字元的編碼和解碼。
  2. 二進位 I/O (Binary I/O):處理 bytes Object。當你需要處理非文字檔案時,例如圖片或音訊,就需要使用這種模式。
  3. 原始 I/O (Raw I/O):這是二進位 I/O 的底層介面,通常不直接使用。

理解這幾種類型有助於你在不同情境下選擇正確的檔案處理方式。

✍️ 基本檔案操作:讀取與寫入

使用 open() 函數,不用導入 (import) 即可讀寫文件。

open() 函數通常接受兩個參數:檔案路徑和模式 (mode)。

檔案模式 (Modes)

  • 'r': 讀取 (Read) - 讀取檔案內容。如果檔案不存在會報錯。(預設模式)
  • 'w': 寫入 (Write) - 寫入檔案。如果檔案已存在,會清空原有內容;如果檔案不存在,則會建立新檔案。
  • 'a': 附加 (Append) - 在檔案末尾追加內容。如果檔案不存在,則會建立新檔案。
  • 'r+': 讀取和寫入 (Read & Write) - 可同時進行讀寫。
  • 加上 'b' 表示二進位 (Binary) 模式,例如 'rb', 'wb'

📖 讀取文字檔案

讓我們看看如何讀取一個檔案。

傳統方法:手動關閉檔案 在舊式代碼中,你可能會看到這樣的寫法:

python
# 假設我們有一個 'hello.txt' 檔案,內容是 "Hello, Python!"
f = open('hello.txt', 'r', encoding='utf-8') 
content = f.read()
print(content)
# 完成操作後,必須手動關閉檔案,釋放資源
f.close()

這種方法直觀,但有風險:如果你忘記寫 f.close(),或者在讀取過程中發生錯誤,程式可能會在關閉檔案前中斷,導致資源洩漏。

推薦做法:使用 with 陳述式 為了讓代碼更安全、更簡潔,Python 提供了 with 陳述式。它使用了一種叫做「資源管理器」(Context Manager) 的機制,能夠自動處理資源的開啟與關閉

python
# 使用 with,無需手動 close()
with open('hello.txt', 'r', encoding='utf-8') as f:
    content = f.read()
    print(content)

# 當代碼塊執行完畢後,無論是否發生錯誤,Python 都會自動為你關閉檔案

with 是處理檔案的最佳實踐,它讓你的代碼更健壯,也更具可讀性。

📝 寫入與附加文字

使用 'w' 模式可以寫入檔案,而 'a' 模式則用於附加內容。

python
# 使用 'w' 模式寫入檔案 (會覆蓋原有內容)
with open('log.txt', 'w', encoding='utf-8') as f:
    f.write('這是第一條日誌。\n')

# 使用 'a' 模式附加內容到檔案末尾
with open('log.txt', 'a', encoding='utf-8') as f:
    f.write('這是附加的第二條日誌。\n')

關於編碼 (Encoding) 當處理文字檔時,明確指定 encoding='utf-8' 是一個非常好的習慣。UTF-8 是目前最通用的編碼,能處理包括中文在內的各種語言。如果不指定,Python 會使用系統的預設編碼,這在不同電腦上可能不同,從而導致亂碼問題。

🖼️ 處理二進位檔案

處理圖片、音訊等非文字數據時,你需要在模式後面加上 'b',表示以二進位 (binary) 方式操作。

python
# 假設要複製一張圖片
try:
    # 以二進位讀取模式 ('rb') 開啟來源檔案
    with open('source_image.jpg', 'rb') as f_read:
        binary_content = f_read.read()

    # 以二進位寫入模式 ('wb') 開啟目標檔案
    with open('destination_image.jpg', 'wb') as f_write:
        f_write.write(binary_content)
    print("圖片複製成功!")
except FileNotFoundError:
    print("錯誤:來源圖片不存在。")

在二進位模式下,你讀取到的是 bytes Object,而不是 str,且不需要指定 encoding

📂 檔案與資料夾進階管理

當你需要檢查檔案是否存在、重命名、刪除等更複雜的操作時,就需要藉助 Python 的 os 模組。你必須先 import os 才能使用這些功能。

🔍 檔案管理

os 模組提供了一系列函數來操作檔案系統中的檔案。

python
import os

# 準備測試檔案
original_file = 'notes.txt'
renamed_file = 'old_notes.txt'
with open(original_file, 'w') as f:
    f.write('一些筆記')

# 1. 檢查檔案是否存在
if os.path.exists(original_file):
    print(f"檔案 '{original_file}' 存在。")

# 2. 重命名檔案
os.rename(original_file, renamed_file)
print(f"檔案已重命名為 '{renamed_file}'。")

# 3. 刪除檔案
os.remove(renamed_file)
print(f"檔案 '{renamed_file}' 已被刪除。")

📁 資料夾管理

同樣地,你也可以使用 os 模組來管理資料夾 (目錄)。

python
import os

# 定義資料夾名稱
dir_name = 'my_project'
renamed_dir_name = 'archived_project'

# 1. 建立資料夾
if not os.path.exists(dir_name):
    os.mkdir(dir_name)
    print(f"資料夾 '{dir_name}' 已建立。")

# 2. 列出資料夾內容 (此時應為空)
print(f"'{dir_name}' 中的內容: {os.listdir(dir_name)}")

# 3. 重命名資料夾
os.rename(dir_name, renamed_dir_name)
print(f"資料夾已重命名為 '{renamed_dir_name}'。")

# 4. 刪除資料夾 (注意:os.rmdir 只能刪除空資料夾)
os.rmdir(renamed_dir_name)
print(f"資料夾 '{renamed_dir_name}' 已被刪除。")

🛡️ 處理檔案相關的例外

檔案操作很容易出錯。例如,嘗試讀取一個不存在的檔案或沒有權限寫入某個位置。使用 try...except 結構來捕捉這些例外,可以讓你的程式更強健。

最常見的檔案相關例外有:

  • FileNotFoundError: 檔案不存在。
  • PermissionError: 沒有足夠的權限。
  • IsADirectoryError: 嘗試像檔案一樣打開一個資料夾。

範例:安全地讀取檔案

python
try:
    with open('non_existent_file.txt', 'r', encoding='utf-8') as f:
        print(f.read())
except FileNotFoundError:
    print("錯誤:你想讀取的檔案不存在。")
except PermissionError:
    print("錯誤:沒有權限讀取此檔案。")
except Exception as e:
    print(f"發生了未預期的錯誤: {e}")

將檔案操作放在 try 塊中,可以讓你針對性地處理可能發生的問題,並給出友好的提示,而不是讓程式直接崩潰。

🚀 總結

掌握 Python 的檔案處理能力是成為一個高效開發者的關鍵一步。這篇文章涵蓋了從基本概念到實際應用的核心知識點:

  • 使用 open()with 陳述式來安全地讀寫檔案。
  • 區分文字和二進位模式,並記得為文字檔指定 utf-8 編碼。
  • 利用 os 模組進行檔案和資料夾的管理,包括建立、刪除、重命名等操作。
  • 通過 try...except 處理檔案操作中可能出現的例外情況。

📚 參考資料

KF Software House