HOWTO · Python
在 Python 中讀取帶有標題的 CSV
瞭解如何在 Python 中讀取帶有標題的 CSV。
本頁內容
Python 標準函式庫中的 csv 模組可以逐列讀取逗號分隔的檔案。CSV 檔案通常會在第一列存放欄名,後續各列則是資料記錄。以下範例都假設檔案採用這種格式;csv.reader 本身不會自動將第一列視為標頭。它會回傳可迭代的資料列,每列都是由字串組成的清單。
以下範例會自行建立小型輸入檔,因此不必下載其他檔案就能執行。讀取實際檔案時,請將暫存檔設定改為檔案路徑,並使用 newline="" 開啟,再依檔案內容選擇適當的編碼。你也可以查看這份電子郵件 CSV 檔案作為輸入範例。每個範例後方都附有可選取的預期輸出。
在 Python 中讀取含標頭的 CSV 檔案
將開啟的文字檔案傳給 csv.reader,再逐列走訪結果。迴圈會包含每一列,因此第一個列印出的清單就是欄名列。若你想先檢視原始資料,再另外處理標頭,這種方式就很實用。
執行以下範例:
本節中的程式碼以及顯示的標籤或輸出仍為英文。
import csv
import tempfile
with tempfile.NamedTemporaryFile(mode="w", encoding="utf-8", newline="", delete=False) as source:
source.write("name,team\nAda,Research\nLin,Design\n")
path = source.name
with open(path, encoding="utf-8", newline="") as source:
rows = csv.reader(source)
for row in rows:
print(row)
['name', 'team']
['Ada', 'Research']
['Lin', 'Design']
讀取器會依照 CSV 引號規則解析欄位;如果欄位中有以引號括住的逗號,手動以逗號切割每一行可能會得到錯誤結果。逐列走訪檔案只需讀取一次,因此所需時間會隨輸入大小呈線性增加。檔案較大時,這種做法也不必一次將所有資料列保存在記憶體中。
取出標頭並分別處理資料列
對讀取器呼叫內建的 next() 函式,取出第一列並將它存成標頭。接著讀取器會從下一列繼續,因此迴圈只會處理資料記錄。這樣就能將欄名與欄位值分開,而不必先把整個檔案載入清單。
執行以下範例。輸出中的 Header: 標籤及示例資料會以英文顯示:
本節中的程式碼以及顯示的標籤或輸出仍為英文。
import csv
import tempfile
with tempfile.NamedTemporaryFile(mode="w", encoding="utf-8", newline="", delete=False) as source:
source.write("name,team\nAda,Research\nLin,Design\n")
path = source.name
with open(path, encoding="utf-8", newline="") as source:
rows = csv.reader(source)
header = next(rows)
print("Header:", ", ".join(header))
for row in rows:
print(dict(zip(header, row)))
Header: name, team
{'name': 'Ada', 'team': 'Research'}
{'name': 'Lin', 'team': 'Design'}
這裡的 zip 會將每個欄名與相應欄位配對,而 dict 會讓你能依名稱存取這些配對。這種做法假設檔案有標頭列,而且每筆記錄的欄位順序都相同。如果檔案可能沒有任何資料列,請先確認是否讀得到第一列,再將它當作標頭;否則 next() 就沒有資料列可回傳。
使用不同的 delimiter 讀取 CSV
預設的分隔符號是逗號。如果檔案使用分號,請將 delimiter 引數傳給 csv.reader;請依照輸入檔實際用來分隔欄位的字元設定。讀取器的行為相同,但標頭仍須明確處理:依照慣例,第一列存放標頭;csv.reader 不會將它辨識為標頭,因此此範例會先用 next() 取出第一列,再列印資料記錄。
執行以下範例。輸出中的 Header: 標籤及示例資料會以英文顯示:
本節中的程式碼以及顯示的標籤或輸出仍為英文。
import csv
import tempfile
with tempfile.NamedTemporaryFile(mode="w", encoding="utf-8", newline="", delete=False) as source:
source.write("name;team\nAda;Research\nLin;Design\n")
path = source.name
with open(path, encoding="utf-8", newline="") as source:
rows = csv.reader(source, delimiter=";")
header = next(rows)
print("Header:", ", ".join(header))
for row in rows:
print(", ".join(row))
Header: name, team
Ada, Research
Lin, Design
如果檔案使用其他分隔符號,請將 delimiter 設為檔案採用的字元,例如定位字元。使用 CSV 模組開啟檔案時,請保留 newline="",並選擇符合來源資料的編碼。如果資料列含有加引號的欄位或內嵌換行,請交由 csv.reader 解析,不要自行預先處理各行。