| 模式 | 說明 |
'r' | 唯讀 (預設) |
'w' | 寫入,截斷現有檔案 |
'a' | 附加,游標在檔尾 |
'x' | 獨佔建立,檔案存在則失敗 (Py3.3+) |
'+' | 更新 (讀寫),如 'r+', 'w+' |
'b' | 二進位模式 |
't' | 文字模式 (預設) |
換行符跨平台自動處理
Python 文字模式採用 通用新行模式:
- 讀取時:
\r\n (Windows)、\r (舊 Mac)、\n (Unix) 統一轉為 \n。
- 寫入時:
\n 依平台自動轉換 (Windows → \r\n)。
- 若需保持原始換行符,開啟時加
newline='':open('f.txt', 'r', newline='')。
write() vs writelines() 關鍵差異
f.write(str) # 寫入單一字串,不自動加換行
f.writelines(seq) # 寫入字串可迭代物件 (list, tuple, generator),同樣不加換行
常見錯誤:以為 writelines 會自動換行,實際需自行在每個元素末尾加 \n。
大檔案高效讀寫模式
逐行讀取 (記憶體友善)
with open('huge.log', 'r', encoding='utf-8') as f:
for line in f: # 惰性迭代,一次只載入一行
process(line)
固定區塊讀取二進位檔
CHUNK = 1024 * 1024 # 1MB
with open('src.bin', 'rb') as src, open('dst.bin', 'wb') as dst:
while True:
chunk = src.read(CHUNK)
if not chunk:
break
dst.write(chunk)
原地修改檔案內容 (臨時檔 + 原子替換)
import os, tempfile
def replace_in_file(path, old, new, encoding='utf-8'):
with open(path, 'r', encoding=encoding) as src, \
tempfile.NamedTemporaryFile('w', encoding=encoding, delete=False, dir=os.path.dirname(path)) as tmp:
for line in src:
tmp.write(line.replace(old, new))
os.replace(tmp.name, path) # 原子替換 (POSIX/Win32 皆支援)
上下文管理器 (with):資源安全保障
- 區塊結束自動呼叫
close(),即使發生例外。
- 檔案物件實作
__enter__/__exit__,回傳自身。
- 所有檔案操作務必使用
with。
常見編碼坑與對策
| 現象 | 原因 | 解決 |
UnicodeDecodeError | 編碼不符 (如用 utf-8 讀 big5) | 確認來源編碼,或用 chardet 偵測 |
| 中文變亂碼 | 終端機編碼與檔案編碼不同 | 統一專案編碼為 UTF-8,終端機設為 UTF-8 |
| BOM 干擾 | UTF-8 with BOM | 開啟用 encoding='utf-8-sig' 自動移除 BOM |
完整範例:CSV 風格資料處理管線
def process_csv_like(input_path, output_path, transform_func, encoding='utf-8'):
with open(input_path, 'r', encoding=encoding, newline='') as fin, \
open(output_path, 'w', encoding=encoding, newline='') as fout:
for i, line in enumerate(fin):
if i == 0:
fout.write(line) # 保留標頭
continue
fields = line.rstrip('\n').split(',')
new_fields = transform_func(fields)
fout.write(','.join(new_fields) + '\n')
掌握上述模式,即能安全、高效處理各類檔案 I/O 需求。
- 上一篇文章: jQuery 向上遍歷 DOM 樹完全解析:parent()、parents()、closest() 差異與實戰選型
- 下一篇文章: Python ElementTree 操作 XML 完整指南:解析、查詢、建構、屬性存取與美化輸出
Copyright ©
程式碼之家 All Rights Reserved