📚Python CSV 全攻略(內建 csv 模組 + 常見實務)
這份教學聚焦 Python 內建
csv模組 的正確用法與最佳實務,並補充少量pandas的進階技巧。涵蓋讀寫、方言(dialect)、引號/跳脫、編碼、巨量資料處理、常見陷阱與範例食譜。
🔰 基礎觀念
CSV(Comma-Separated Values)是一種以分隔符號(預設逗號
,)分隔欄位的純文字格式。各平台換行符可能不同(
\n,\r\n)。以 Python 內建
csv模組 讀寫時,開檔務必加上newline='',以避免多出空白行(Windows 常見)。
import csv
from pathlib import Path
p = Path('data.csv')
with p.open('w', newline='', encoding='utf-8') as f:
writer = csv.writer(f)
writer.writerow(['id', 'name', 'score'])
writer.writerow([1, 'Alice', 95])📖 讀取:csv.reader 與 csv.DictReader
csv.reader 與 csv.DictReadercsv.reader
csv.reader逐列回傳 list(每列一個 list)。
常用參數:
delimiter=',':分隔符(可改成\t處理 TSV)。quotechar='"'、escapechar='\\':引號與跳脫。skipinitialspace=True:忽略分隔後的首個空白。
csv.DictReader
csv.DictReader每列回傳 dict(以首列或指定欄名當 key)。
若檔案沒有標題列,可自訂欄名:
讀取時的型別轉換
csv 讀進來都是字串,需自行轉型:
✍️ 寫入:csv.writer 與 csv.DictWriter
csv.writer 與 csv.DictWritercsv.writer
csv.writer常用參數:
delimiter=',':分隔符。lineterminator='\n':列結尾(預設依平台)。quoting=:引號策略:csv.QUOTE_MINIMAL(預設,必要時加引號)csv.QUOTE_ALL(全欄位加引號)csv.QUOTE_NONNUMERIC(非數值加引號,讀取時自動轉為 float)csv.QUOTE_NONE(不加引號,通常需搭配escapechar)
quotechar='"'、escapechar='\\'
csv.DictWriter
csv.DictWriter🗣️ Dialect(方言)與自動偵測
註冊自訂方言
csv.Sniffer 自動偵測格式
csv.Sniffer 自動偵測格式🌐 編碼(Encoding)與 Excel 相容
一般建議使用
utf-8。若要給部分 Excel 版本(特別是 Windows/舊版)可靠辨識,寫檔時可用
utf-8-sig以加入 BOM:
若來源是 CP950/Big5 等本地編碼,讀取時需指定正確
encoding,並處理錯字:
🚀 巨量檔案與效能技巧
逐行處理:避免一次載入全部(特別是
readlines()),改用迭代器。欄位過濾/映射:在讀取迴圈中即時轉型與過濾,減少中間結構。
分塊寫出:處理 N 筆就寫一次,避免巨大記憶體佔用。
壓縮檔:可直接用
gzip/bz2搭配檔案物件:
🧪 常見陷阱與排錯
Windows 寫檔多出空行:忘了
newline=''。欄位內含逗號/引號/換行:需設定
quoting(預設即可處理),或搭配escapechar。型別全是字串:自行轉型(
int,float,datetime)。雜訊標頭/註解列:讀取時先
next(reader)跳過或預處理。分隔符不是逗號:指定
delimiter或用Sniffer。
🍱 實用食譜(Recipes)
1) 篩選列並輸出新檔
2) 轉置(rows ↔ columns)
3) 追加新欄位(依既有欄計算)
4) 合併多個 CSV(同欄位)
5) 自訂分隔符(TSV / 管線符)
🧰 與 pandas 的快速對照
pandas 的快速對照讀:
寫:
大量資料:
chunksize分塊讀取、指定dtype降低記憶體。
✅ 重點總結
讀寫 CSV 時 一定用
newline='';編碼建議utf-8/utf-8-sig(對 Excel 友善)。欄位內含逗號、引號、換行時,調整
quoting/escapechar;或保留預設讓模組自動處理。DictReader/DictWriter能以欄名取值,更可讀。巨量檔案:逐行處理、分塊寫出、必要時搭配壓縮與
pandas。善用
Sniffer與 Dialect 對付未知或非標準 CSV。
Last updated