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) 載入產生的檔案,並查看資料列和欄位名稱。這樣可以同時確認寫入磁碟的文字內容,以及解析後的表格。