在 Python 中處理文件時,read() 是最基礎也最常用的讀取方法。它能一次性讀取指定位元組數的內容,或讀取整個文件。本文詳細說明 read() 的語法、參數、回傳值與實戰範例,並補充常見陷阱與最佳實務。
方法語法與參數
file_object.read(size=-1)
| 參數 | 說明 |
size (可選) | 要讀取的位元組數 (整數)。預設 -1 表示讀取至 EOF (整個文件)。 |
回傳值
- 字串 (文字模式) 或 bytes (二進位模式),包含讀取到的內容。
- 若已在 EOF,回傳空字串
'' 或 b''。
基本範例
# 文字模式讀取
with open('foo.txt', 'r', encoding='utf-8') as f:
content = f.read(10) # 讀取前 10 個字元
print(f'讀取內容: {content}')
print(f'目前位置: {f.tell()}') # 10
remaining = f.read() # 讀取剩餘全部
print(f'剩餘內容: {remaining}')
進階用法與情境
1. 分塊讀取大文件 (避免記憶體爆炸)
CHUNK_SIZE = 8192 # 8KB
with open('large_log.txt', 'r', encoding='utf-8') as f:
while True:
chunk = f.read(CHUNK_SIZE)
if not chunk:
break
process_chunk(chunk) # 處理每一塊
2. 二進位模式讀取圖片/影音
with open('image.png', 'rb') as f:
header = f.read(8) # 讀取 PNG 簽名: 89 50 4E 47 0D 0A 1A 0A
print(header.hex()) # 89504e470d0a1a0a
3. 配合 seek() 隨機存取
with open('data.bin', 'rb') as f:
f.seek(100) # 移動到第 100 位元組
data = f.read(50) # 讀取 100-149 位元組
常見陷阱與注意事項
| 問題 | 原因 | 解決方案 |
| 讀取中文亂碼 | 未指定 encoding,預設使用平台編碼 (Windows cp950) | 明確指定 encoding='utf-8' 或 'utf-8-sig' (含 BOM) |
| read() 回傳空字串 | 游標已在 EOF | 檢查是否已讀取完畢,或用 seek(0) 重置 |
| 大文件記憶體不足 | 一次 read() 整個 GB 級文件 | 使用分塊讀取或 mmap 模組 |
| Windows 換行符 \r\n 問題 | 文字模式預設會轉換 \r\n → \n | 二進位模式 'rb' 保持原始位元組,或用 newline='' 關閉轉換 |
read() vs readline() vs readlines()
| 方法 | 用途 | 記憶體效率 |
read(size) | 任意位元組讀取、二進位、大文件分塊 | 高 (可控制塊大小) |
readline() | 逐行讀取文字文件 | 高 (逐行處理) |
readlines() | 一次讀取所有行成列表 | 低 (全載入記憶體) |
最佳實務總結
- 永遠使用
with 陳述式:自動關閉文件,即使發生例外也能釋放資源。
- 明確指定 encoding:
open('file.txt', 'r', encoding='utf-8')。
- 大文件分塊讀取:設定合理的
CHUNK_SIZE (4KB-64KB)。
- 二進位檔用 'rb'/'wb':避免換行符轉換破壞資料。
- 配合
tell()/seek() 實現隨機存取與斷點續傳邏輯。
熟練掌握 read() 及其變體,是 Python 文件處理能力的基石,無論是日誌分析、資料管線、網路協定解析,都離不開這項核心技能。