HOWTO · Python
在 Python 中將列表寫入 CSV 列
本教程演示如何在 Python 中將列表寫入 CSV 列。
本頁內容
若要將平行的 Python 清單寫成 CSV 欄,請用 zip() 組合各清單中位置相對應的值,再將產生的資料列傳給 csv.writer。這類常見工作只需使用 Python 內建的 csv 模組。如果資料已按資料列排列,可直接使用巢狀清單;若專案適合使用 pandas 或 NumPy 及其資料結構,也可以選用這些工具。
使用 csv.writer 將平行清單寫成 CSV 欄
每個輸入清單代表一個欄位。zip() 會依序取出各清單的第一個項目、第二個項目,以此類推。將每個產生的 tuple 寫成一筆 CSV 資料列,就能讓位置相同的值並列。開啟 CSV 檔案時,請使用 newline="",讓 CSV 模組一致地處理換行字元。
執行以下範例:
本節中的程式碼以及顯示的標籤或輸出仍為英文。
import csv
from pathlib import Path
from tempfile import TemporaryDirectory
names = ["Alice", "Bob", "Charlie"]
ages = [30, 25, 35]
cities = ["New York", "Los Angeles", "Chicago"]
with TemporaryDirectory() as directory:
path = Path(directory) / "people.csv"
with path.open("w", newline="", encoding="utf-8") as file:
writer = csv.writer(file)
writer.writerow(["Name", "Age", "City"])
writer.writerows(zip(names, ages, cities))
print(path.read_text(encoding="utf-8"), end="")
以下是範例產生的 CSV 文字輸出:
Name,Age,City
Alice,30,New York
Bob,25,Los Angeles
Charlie,35,Chicago
Name,Age,City
Alice,30,New York
Bob,25,Los Angeles
Charlie,35,Chicago
檔案先包含標頭,接著每個人各占一筆記錄;每一列都有姓名、年齡和城市。使用暫存目錄可讓範例自成一體;若要在指令碼結束後保留檔案,請將路徑改成想要的儲存位置。程式碼中的標籤與輸出都是英文;上方也列出了可選取的英文 CSV 輸出。
zip() 會在最短的輸入清單用盡時停止。如果清單長度不同,較長清單中剩餘的值就不會寫入。若必須保留每個值,請在寫入前比較清單長度,並決定如何處理長度不一致的情況,例如拒絕資料或補上缺漏值。清單很多時,請為每個清單取清楚的名稱,並在同一次 zip() 呼叫中納入所有清單。
使用 csv.writer 將資料列寫入 CSV 檔案
如果資料本來就是按資料列排列,請使用巢狀清單,讓每個內層清單代表一筆記錄。呼叫一次 writerows() 可寫入所有記錄;若要逐列寫入,則使用 writerow()。例如,rows = [["Alice", 30], ["Bob", 25]] 會寫入兩筆記錄,每筆各有兩個欄位。這與平行清單不同:巢狀清單描述的是資料列,而 zip() 會將平行欄位轉成 CSV 檔案中的資料列。
標頭就是一般的第一列,因此若讀者需要欄名,請明確加入標頭。CSV 寫入器會視需要為含有逗號、引號或換行字元的欄位加上引號;它不會根據 Python 變數名稱推斷標頭。
使用 pandas 將清單寫成 CSV 欄
如果專案已使用 pandas,可以建立字典,以欄名作為鍵、清單作為值,再用這個字典建立 DataFrame,接著呼叫 to_csv(..., index=False)。index=False 會避免 pandas 的資料列標籤成為額外的 CSV 欄位。例如,相關操作是 pd.DataFrame({"Name": names, "Age": ages}) 和 df.to_csv("people.csv", index=False)。
這裡是用法示意,並非本文中實際執行的範例。pandas 是額外的相依套件;使用這個方法前,請先在專案中安裝並管理它。提供給 DataFrame 各欄的清單長度必須相容。
使用 NumPy 將數值陣列寫成 CSV
若資料是數值陣列,可使用 NumPy 的 savetxt;設定 delimiter="," 即可寫入以逗號分隔的值。常見的呼叫方式是 np.savetxt("measurements.csv", array, delimiter=",")。這個方法適合數值陣列,包括二維陣列;陣列中的每一列會成為檔案中的一列。若欄位混合文字與數值,這就不是通用的選擇;這種情況請使用內建的 CSV 模組。
這個 NumPy 呼叫是用法示意,本文並未執行。NumPy 是額外的相依套件;若需要特定的小數精度或數值表示方式,可能還需要設定格式選項。
依照資料選擇寫入方式
若需要輕量的標準函式庫方案,請使用內建的 csv 模組。用 zip() 組合平行清單,將位置相對應的值放入各欄;如果資料已按資料列排列,則傳入巢狀清單。若資料已存於 DataFrame,且需要其索引與資料處理功能,可選用 pandas。數值陣列則可使用 NumPy 的 savetxt。無論採用哪種方式,都應先確認 CSV 是否需要標頭,並檢查各欄資料是否對齊,再開始寫入。
常見問題
CSV 檔案是什麼?
CSV 是逗號分隔值(comma-separated values)的縮寫,是一種用於表格資料的文字格式。CSV 寫入器會為含有逗號、引號或換行字元的欄位加上引號,因此建議使用 CSV 函式庫,而不是自行用逗號串接值。
在 Python 中寫入 CSV 需要安裝函式庫嗎?
不需要。Python 內建 csv 模組。若專案需要 pandas 或 NumPy 的資料結構或功能,可以選擇安裝這些第三方相依套件。
可以將巢狀清單寫入 CSV 檔案嗎?
可以。將資料列清單傳給 writerows();每個內層清單會提供一筆 CSV 資料列的欄位。若要將平行清單表示的資料寫成欄,請先用 zip() 組合清單。
如何在 Python 中讀取 CSV 檔案?
請使用內建 csv 模組中的 csv.reader 或 csv.DictReader。如果專案使用 pandas,也可以用 pandas.read_csv() 將檔案載入 DataFrame。
可以在現有 CSV 檔案中附加資料列嗎?
可以。使用附加模式("a")開啟檔案,並設定 newline="";建立 csv.writer 後,呼叫 writerow() 或 writerows() 寫入新記錄。只有在檔案尚無標頭時才加入標頭。