專項練習 · 9 分鐘閱讀

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

你的練習清單

常見問題

為什麼 DictReader 把數字也回傳成字串?

CSV 不攜帶型別資訊。驗證後要用 int 或 float 顯式轉換欄位。

讀 CSV 一定要用 pandas 嗎?

不需要。普通讀寫用標準函式庫 csv 就夠了。需要表格分析時再用 pandas。

QUOTE_MINIMAL 會做什麼?

只在欄位包含分隔符、引號字元或換行時加引號。它是預設引號模式。

練習 CSV

12 道題,覆蓋 reader、DictReader、寫入行、引號和檔案處理。

打開練習

繼續閱讀: