Python 文件處理
在任何編程語言中,處理檔案都是一項基礎且重要的技能。無論是讀取設定檔、處理用戶上傳的數據,還是將程式運行的結果保存下來,你都離不開檔案輸入/輸出 (File I/O) 操作。Python 提供了強大而簡潔的工具來處理檔案,讓這項工作變得非常直觀。
這篇文章將帶你學習 Python 檔案處理的基礎知識,從理解 File Object 和檔案串流 (Stream) 開始,到實際操作文字檔和二進位檔案。你將學會如何管理檔案和資料夾,以及如何優雅地處理可能發生的錯誤。
📜 什麼是 File Object 和 File Stream?
在 Python 中,當你打開一個檔案時,你會得到一個 File Object。這個 Object 是 Python 對檔案系統中實際檔案的一個抽象表示,它包含了檔案的各種屬性(如名稱、模式等)和可用於操作檔案的方法(如讀取、寫入等)。
而 File Stream (檔案串流) 則是指數據流動的通道。想像一下,數據就像水流一樣,可以從你的程式「流入」檔案(寫入),也可以從檔案「流出」到你的程式(讀取)。根據處理的數據類型,Python 的 io
模組將串流主要分為三種類型:
- 文字 I/O (Text I/O):處理
str
(字串) Object。這是最常見的類型,用於讀寫文字檔。它會自動處理字元的編碼和解碼。 - 二進位 I/O (Binary I/O):處理
bytes
Object。當你需要處理非文字檔案時,例如圖片或音訊,就需要使用這種模式。 - 原始 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'
。
📖 讀取文字檔案
讓我們看看如何讀取一個檔案。
傳統方法:手動關閉檔案 在舊式代碼中,你可能會看到這樣的寫法:
# 假設我們有一個 '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) 的機制,能夠自動處理資源的開啟與關閉。
# 使用 with,無需手動 close()
with open('hello.txt', 'r', encoding='utf-8') as f:
content = f.read()
print(content)
# 當代碼塊執行完畢後,無論是否發生錯誤,Python 都會自動為你關閉檔案
with
是處理檔案的最佳實踐,它讓你的代碼更健壯,也更具可讀性。
📝 寫入與附加文字
使用 'w'
模式可以寫入檔案,而 'a'
模式則用於附加內容。
# 使用 '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) 方式操作。
# 假設要複製一張圖片
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
模組提供了一系列函數來操作檔案系統中的檔案。
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
模組來管理資料夾 (目錄)。
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
: 嘗試像檔案一樣打開一個資料夾。
範例:安全地讀取檔案
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
處理檔案操作中可能出現的例外情況。