HOWTO · Python
在 Python 中將字典寫入 CSV
它演示瞭如何在 Python 中把一個字典寫入 csv 檔案。
本頁內容
使用 Python 標準的 csv 模組,將字典寫入 CSV 檔案。若要讓每組鍵值各佔一列,請使用 writer();若多個字典共用欄位,並要將它們寫成標題列下方的紀錄,則使用 DictWriter()。
使用 csv.writer 將單一字典寫成鍵值列
一般的 csv.writer 會寫入一連串值。逐一走訪字典中的項目,並將每組鍵值配對作為一列傳入,即可得到兩欄:一欄放鍵,另一欄放對應的值。
執行以下範例。程式碼與輸出中的欄位名稱仍為英文;輸出會逐列顯示 Name、Age、Country 及其對應值。
import csv
import tempfile
from pathlib import Path
record = {"Name": "John", "Age": "23", "Country": "USA"}
with tempfile.TemporaryDirectory() as temp_dir:
path = Path(temp_dir) / "person.csv"
with path.open("w", newline="", encoding="utf-8") as file:
writer = csv.writer(file)
for key, value in record.items():
writer.writerow([key, value])
print(path.read_text(encoding="utf-8"), end="")
Name,John
Age,23
Country,USA
輸出列會是 Name,John、Age,23 和 Country,USA 這樣的格式;這種排列沒有標題列。程式會寫入暫存檔,再印出檔案內容。以 w 模式開啟時,若檔案不存在便會建立;若檔案已存在,原有內容會立即遭到截斷。若要保留先前的資料列,請使用附加模式 a,並先決定如何處理標題列。
使用 csv.DictWriter 將多個字典寫成紀錄
若有多個共用鍵的字典組成的清單,DictWriter 會將每個字典對應為一筆紀錄。將 fieldnames 設為所需的欄位順序,寫入一次標題列,再將每個字典寫成一列。結果會先有一列標題,後面接著每個字典各一列。
本節中的程式碼以及顯示的標籤或輸出仍為英文。
import csv
import tempfile
from pathlib import Path
records = [
{"Name": "John", "Age": "23", "Country": "USA"},
{"Name": "Jose", "Age": "44", "Country": "Spain"},
]
fieldnames = ["Name", "Age", "Country"]
with tempfile.TemporaryDirectory() as temp_dir:
path = Path(temp_dir) / "people.csv"
with path.open("w", newline="", encoding="utf-8") as file:
writer = csv.DictWriter(file, fieldnames=fieldnames)
writer.writeheader()
writer.writerows(records)
print(path.read_text(encoding="utf-8"), end="")
Name,Age,Country
John,23,USA
Jose,44,Spain
fieldnames 序列會同時決定標題文字與欄位順序,不受各筆紀錄中鍵的插入順序影響。每個字典都應提供這些欄位的值。預設情況下,若某列含有額外的鍵,DictWriter 會引發 ValueError;只有在確定要捨棄額外資料時,才設定 extrasaction="ignore"。缺少的鍵會以 restval 的值寫入;其預設值是空字串。
選擇檔案模式並處理寫入錯誤
開啟 CSV 文字檔時,請一律使用 newline="",讓 CSV 模組一致地管理換行。w 模式會取代原有內容;a 模式會在檔案末尾新增資料列,並在檔案不存在時建立檔案。以附加模式寫入時,若檔案已有標題列,就不要再次寫入。
檔案操作可能引發 OSError,例如路徑無法使用或存取遭拒。只有在程式能採取有用的處理方式時才捕捉這個例外,例如指出路徑並請使用者選擇其他位置。捕捉錯誤不代表部分寫入已經復原;若應用程式需要確保結果全有或全無,請檢查檔案或以新檔取代。