首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 更多程式設計知識

Python 檔案讀寫實戰:文字/二進位模式、編碼處理、大檔案高效技巧

     編輯:更多程式設計知識

Python 以簡潔語法與強大標準庫著稱,檔案操作更是日常開發高頻任務。本文涵蓋 open() 參數詳解、文字與二進位模式差異、跨平台換行符處理、write/writelines 陷阱、大檔案分塊處理模式,並提供可直接套用的最佳實務範本。

基礎開啟模式與編碼


# 文字模式 (預設),指定 encoding 避免平台差異
f = open('data.txt', 'r', encoding='utf-8')      # 讀取
fw = open('out.txt', 'w', encoding='utf-8')      # 寫入 (截斷)
fa = open('log.txt', 'a', encoding='utf-8')      # 附加

# 二進位模式:不做任何編碼/換行轉換
fb = open('image.png', 'rb')   # 讀取位元組
fwb = open('copy.png', 'wb')   # 寫入位元組

關鍵參數:

換行符跨平台自動處理

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。

常見編碼坑與對策

模式說明
'r'唯讀 (預設)
'w'寫入,截斷現有檔案
'a'附加,游標在檔尾
'x'獨佔建立,檔案存在則失敗 (Py3.3+)
'+'更新 (讀寫),如 'r+', 'w+'
'b'二進位模式
't'文字模式 (預設)

完整範例: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 需求。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
現象原因解決
UnicodeDecodeError編碼不符 (如用 utf-8 讀 big5)確認來源編碼,或用 chardet 偵測
中文變亂碼終端機編碼與檔案編碼不同統一專案編碼為 UTF-8,終端機設為 UTF-8
BOM 干擾UTF-8 with BOM開啟用 encoding='utf-8-sig' 自動移除 BOM