HOWTO · Python

用 Python 將陣列寫入 CSV 檔案

本教程演示瞭如何在 Python 中將陣列儲存到 CSV 檔案

本頁內容

CSV(逗號分隔值)會將表格資料儲存為文字列,因此適合用來與試算表及其他程式分享處理後的陣列。陣列型資料可使用 NumPy;若已使用 DataFrame,可選擇 Pandas;若要處理一般資料列並可靠地引用特殊字元,則可使用 Python 的 csv 模組。以下範例以逗號分隔欄位,並說明如何讀取產生的資料列。

使用 numpy.savetxt() 將 NumPy 陣列寫入 CSV

numpy.savetxt() 可將一維或二維陣列寫入文字檔。傳入 delimiter="," 可用逗號分隔欄位;預設分隔符號是空格,因此不會產生以逗號分隔的欄位。若要寫入一維數值陣列,且整數文字格式符合需求,可使用 np.savetxt("numbers.csv", data, delimiter=",", fmt="%d")。若是小數值,可選擇 "%.2f" 等格式來控制顯示精度。

若資料表同時包含文字和數字,可建立二維陣列,例如 np.array([["Name", "Age"], ["Ada", 36]]),並傳入 fmt="%s"。NumPy 陣列中的元素必須使用同一種型別,因此混合文字和數字時,數值也會成為字串;這個格式會將它們寫成文字。CSV 本身不會保留 Python 或 NumPy 的型別。讀取檔案的程式若需要整數,就必須自行解讀像 36 這樣的值。

NumPy 會將陣列的每一列寫成 CSV 的一列。除非提供 header,否則不會加入欄名;若有提供標頭,預設會在前面加上註解標記。若要讓欄名直接成為第一列,請設定 header="Name,Age" 和 comments=""。

使用 Pandas DataFrame.to_csv() 將陣列寫入 CSV

若要使用具名欄位,或程式已使用 Pandas,可將類陣列資料轉換成 Pandas DataFrame。例如,df = pd.DataFrame(data, columns=["Name", "Age"]) 會為資料欄設定欄名,而 df.to_csv("people.csv", index=False) 則會將資料寫入檔案。index=False 可避免 Pandas 將列標籤額外寫成第一欄;只有在檔案需要列標籤時才省略這個選項。如果輸出檔案不應包含欄名,請設定 header=False。其他匯出選項請參閱 DataFrame.to_csv() 參考資料。

使用 Python 的 csv.writer() 將資料列寫入 CSV

Python 標準函式庫的 csv.writer() 適合處理包含文字、數字、逗號或引號的資料列。以 newline="" 開啟檔案,建立 writer,然後將資料列傳給 writerows()。若值中含有逗號或引號,writer 會依 CSV 格式加上引號。以下範例只使用標準函式庫,並印出儲存的檔案內容,方便查看資料列和分隔符號的實際形式:

執行此範例:

本節中的程式碼以及顯示的標籤或輸出仍為英文。

import csv
from pathlib import Path
from tempfile import TemporaryDirectory

rows = [[1, 4, 2], [7, 9, 4], [0, 6, 2]]
with TemporaryDirectory() as directory:
    path = Path(directory) / "numbers.csv"
    with path.open("w", newline="", encoding="utf-8") as file:
        writer = csv.writer(file)
        writer.writerows(rows)
    print(path.read_text(encoding="utf-8"), end="")
1,4,2
7,9,4
0,6,2

對於大型輸入,writerows() 可接受可疊代的資料列,因此不必先將整份資料集組成另一個清單。with 區塊結束時,檔案便會關閉。

使用 csv.reader() 讀取 CSV 檔案

csv.reader() 會讀取檔案,並逐列產生字串清單。它是讀取器,不是寫入器物件。例如,寫入檔案的儲存格值 36,讀取時會是字串 "36";若要進行數值運算,請用 int() 或 float() 將它轉換。讀取 CSV 時,也請以 newline="" 開啟文字檔。如果檔案有標頭,請先單獨處理第一列,例如在處理資料列前呼叫 next(reader)。讀取器也會正確解讀加上引號的分隔符號;直接用逗號拆分每一列則無法做到這點。

使用 Python 檔案處理寫入簡單資料列

若資料內容簡單且可控,不會包含逗號、引號或換行字元,直接處理檔案就足夠。將每個值轉成文字,以逗號串接成一列,再以換行字元結尾,例如 file.write(",".join(map(str, row)) + "\n")。這只是手動格式化文字,並非通用的 CSV 序列化方式:像 "Doe, Jane" 這樣的名稱會被拆成兩欄。若資料內容不受限制,請使用 csv.writer(),讓程式正確處理引號和分隔符號。以 CSV 格式輸出時,請使用 newline="" 開啟檔案;若檔案會包含非 ASCII 文字,也請明確指定 UTF-8 等編碼。