Python CSV 練習:讀取、寫入與引號
CSV 看起來像純文字,直到欄位裡出現逗號。csv 模組負責引號、分隔符和行邊界,你不需要手工按行拆分。
把行讀成列表
csv.reader 回傳由列表組成的迭代器。每個欄位一開始都是字串,數字也不例外。除非你決定把第一行當表頭,否則它沒有特殊含義。需要查看多行時用 list 物化。
import csv
from io import StringIO
rows = list(csv.reader(StringIO("a,b\n1,2\n")))
print(rows[0])
print(rows[1][1])行是字串列表
把表頭當作鍵
DictReader 把第一行當作欄位名。之後每一行變成字典,按列存取更可讀。如果檔案沒有表頭,要顯式傳入 fieldnames,避免第一行資料被當成標籤消耗掉。
import csv
from io import StringIO
raw = "name,score\nAda,92\n"
rows = list(csv.DictReader(StringIO(raw)))
print(rows[0]["name"])有名字的列
一次寫入一行
csv.writer 寫入一行並添加所需行結束符。傳入欄位列表,而不是預先拼好的字串,模組才能正確加引號。只有已經擁有多行可迭代物件時才用 writerows。
import csv
from io import StringIO
buffer = StringIO()
writer = csv.writer(buffer)
writer.writerow(["a", "b"])
print(buffer.getvalue().strip())讓寫入器格式化行
資料需要時才加引號
預設的 QUOTE_MINIMAL 只在需要時加引號,QUOTE_ALL 給每個欄位加引號。欄位裡有逗號、引號或換行時必須加引號,csv 模組會處理跳脫。
import csv
from io import StringIO
buffer = StringIO()
writer = csv.writer(buffer, quoting=csv.QUOTE_ALL)
writer.writerow(["a,b", "c"])
print(buffer.getvalue().strip())引號是結構的一部分
用 newline="" 打開檔案
讀寫真實檔案時,用 newline="" 打開,讓 csv 控制行尾。這樣可以避免某些平臺出現空行。資料含非 ASCII 文字時,要顯式指定編碼。
import csv
from io import StringIO
buffer = StringIO(newline="")
writer = csv.writer(buffer)
writer.writerow(["name", "note"])
print(buffer.getvalue().strip())把換行交給 csv
你的練習清單
- 記住 csv.reader 回傳字串,不是數字。
- 表頭能提供有意義列名時使用 DictReader。
- 把欄位列表傳給 writer.writerow,不要傳拼好的字串。
- 只有每個欄位都需要引號時才用 QUOTE_ALL。
- 真實 CSV 檔案用 newline="" 和明確編碼打開。
常見問題
為什麼 DictReader 把數字也回傳成字串?
CSV 不攜帶型別資訊。驗證後要用 int 或 float 顯式轉換欄位。
讀 CSV 一定要用 pandas 嗎?
不需要。普通讀寫用標準函式庫 csv 就夠了。需要表格分析時再用 pandas。
QUOTE_MINIMAL 會做什麼?
只在欄位包含分隔符、引號字元或換行時加引號。它是預設引號模式。
練習 CSV
12 道題,覆蓋 reader、DictReader、寫入行、引號和檔案處理。
繼續閱讀: