HOWTO · Pandas

Pandas 追加資料到 CSV 中

本教程演示瞭如何在追加模式下使用 to_csv()向現有的 CSV 檔案新增資料。

本頁內容

使用 Pandas 的 to_csv() 搭配 mode="a",將 DataFrame 資料列加到 CSV 檔案既有資料列之後。追加模式會保留檔案原有內容。檔案已有標頭列時,請設定 header=False;若不希望 DataFrame 索引成為額外的 CSV 欄位,請設定 index=False。

將 DataFrame 追加到現有的 CSV 檔案

此範例會先建立一個 CSV 檔案,再將第二個 DataFrame 追加到其中。在自己的程式碼中,請使用 CSV 檔案的路徑。追加的欄位順序必須與現有 CSV 欄位相同:CSV 檔案不會儲存可依欄位名稱自動重新排列值的結構描述。

執行此範例:

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

from pathlib import Path
from tempfile import TemporaryDirectory

import pandas as pd

with TemporaryDirectory() as directory:
    path = Path(directory) / "records.csv"
    original = pd.DataFrame({"name": ["Ava"], "score": [8]})
    added = pd.DataFrame({"name": ["Noah"], "score": [9]})

    original.to_csv(path, index=False)
    added.to_csv(path, mode="a", header=False, index=False)
    print(path.read_text(), end="")

第一次寫入會建立檔案和標頭列。第二次使用 mode="a" 將一筆資料列加到檔案末尾,並設定 header=False,避免重複寫入欄位名稱;設定 index=False,則可避免 Pandas 加入資料列索引。最後的檔案會先包含原有資料列,接著是新增的資料列。範例中的欄位標籤 name 和 score 維持英文,因為程式碼區塊須原樣保留。若要將 DataFrame 索引納入為一個欄位,請省略 index=False,並在讀取 CSV 時將這個額外欄位納入考量。

只有在 CSV 檔案為空時才寫入標頭列

如果目標檔案可能是空的,也可能尚不存在,請以追加模式開啟檔案,並檢查目前的檔案位置。以 mode="a" 開啟不存在的路徑會建立檔案。呼叫 tell() 會回報目前位置;以追加模式開啟檔案後,位置為 0 表示檔案是空的。只有在這種情況下才寫入標頭列。此範例中的欄位標籤 name 和 score 維持英文,因為程式碼區塊須原樣保留。

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

from pathlib import Path
from tempfile import TemporaryDirectory

import pandas as pd

with TemporaryDirectory() as directory:
    path = Path(directory) / "records.csv"
    rows = pd.DataFrame({"name": ["Mia"], "score": [7]})

    with path.open("a", encoding="utf-8", newline="") as csv_file:
        write_header = csv_file.tell() == 0
        rows.to_csv(csv_file, header=write_header, index=False)

這種做法同時適用於新檔案和現有 CSV:新建立或空白的檔案會寫入欄位名稱;已有內容的檔案則只會加入新資料列。每次追加時,欄位順序都應相同,欄位也應相容。如果程式中有多個寫入者可能同時更新同一個檔案,請協調這些寫入作業,避免標頭檢查與資料列寫入和其他寫入作業交錯進行。

確認追加的資料列並避免常見錯誤

需要確認內容時,請在寫入後讀取 CSV。第一個範例的檔案會有一個標頭列,後面接著原有資料和追加的資料。執行時,print(path.read_text(), end="") 會以可選取的文字顯示檔案中的實際內容。

調整範例時,請留意以下細節:

  • 追加的 DataFrame 欄位必須與 CSV 欄位順序相同。Pandas 會依位置寫入值;追加時不會依欄位名稱比對 CSV 欄位。
  • 對於已有標頭列且包含內容的檔案,請使用 header=False。重複的標頭列會在讀取時被視為一般資料列。
  • 如果資料不包含資料列索引,請選擇 index=False。否則,請將索引欄納入檔案配置並妥善處理。
  • 追加模式會將文字加到檔案末尾;它不會驗證或修正不相符的欄位、分隔符號或編碼。請讓這些設定與現有 CSV 保持一致。
  • 如果檔案是空的,請在第一筆資料前寫入一次標頭列。上方的 tell() 檢查會利用以追加模式開啟之檔案的位置來決定是否寫入標頭列。

若要在 Python 中快速檢查,請使用 pd.read_csv(path) 載入產生的檔案,並查看資料列和欄位名稱。這樣可以同時確認寫入磁碟的文字內容,以及解析後的表格。