HOWTO · Python
在 Python 中將陣列寫入文字檔案
本教程演示如何在 python 中將陣列儲存到文字檔案中
本頁內容
Python 可以將陣列中的值寫入文字檔,方便日後檢視、分享或載入數值資料。若要自行控制文字排版,可直接寫入檔案;若要自動清理檔案資源,可使用上下文管理器;若需要可再次載入的固定數值格式,則可使用 NumPy 的文字檔函式。以下範例使用暫存路徑,執行後不會留下檔案。
使用 open() 將陣列寫入文字檔
使用 open() 搭配模式 "w",可以建立檔案或取代檔案中原有的內容。此模式只能寫入;若要確認檔案內容,請改用模式 "r" 重新開啟檔案。Python 檔案開啟模式指南說明了其他模式,包括附加模式 "a" 和讀寫模式 "w+"。由於 "w" 會取代舊內容,若要將新文字加到檔案末尾,請改用 "a"。
對於一維序列,先將值轉成文字,再選擇適合讀者的分隔方式。執行以下範例:
本節中的程式碼以及顯示的標籤或輸出仍為英文。
from pathlib import Path
from tempfile import TemporaryDirectory
values = [23, 22, 24, 25]
rows = [[23, 22, 24, 25], [13, 14, 15, 19]]
with TemporaryDirectory() as folder:
path = Path(folder) / "sample.txt"
file = open(path, "w", encoding="utf-8")
file.write("[" + " ".join(map(str, values)) + "]")
file.close()
file = open(path, "r", encoding="utf-8")
contents = file.read()
file.close()
print("Array contents in sample.txt:", contents)
matrix_path = Path(folder) / "matrix.txt"
file = open(matrix_path, "w", encoding="utf-8")
file.write("\n".join(" ".join(map(str, row)) for row in rows))
file.close()
file = open(matrix_path, "r", encoding="utf-8")
matrix_contents = file.read()
file.close()
print("Rows in matrix.txt:")
print(matrix_contents)
此範例會將一維序列寫在同一行,並將二維序列逐列寫入,每列各占一行。每次 write() 呼叫都接受文字,因此數值必須先轉換或格式化成字串。呼叫 close() 會寫出尚未寫入的文字並釋放檔案;由於以 "w" 開啟的檔案無法透過同一個檔案控制代碼讀取,因此需要再次開啟。
使用 str(array) 適合快速顯示,但其格式是為了呈現而設計,可能會依陣列類型和顯示設定而變動。不要將這種表示方式視為穩定的數值交換格式。
使用上下文管理器寫入陣列
Python 的 with 陳述式會作為上下文管理器管理檔案控制代碼,並在縮排區塊結束時關閉檔案;即使區塊中的工作提早結束,也會自動關閉。這樣能保留明確指定文字排版的方式,同時省去手動呼叫 close()。以下範例處理兩種陣列形狀,並在寫入區塊結束後讀取檔案:
本節中的程式碼以及顯示的標籤或輸出仍為英文。
from pathlib import Path
from tempfile import TemporaryDirectory
values = [23, 25, 27, 29, 30]
rows = [[23, 25, 27, 29], [30, 31, 32, 34]]
with TemporaryDirectory() as folder:
one_dimensional_path = Path(folder) / "values.txt"
with open(one_dimensional_path, "w", encoding="utf-8") as file:
file.write(" ".join(map(str, values)))
two_dimensional_path = Path(folder) / "rows.txt"
with open(two_dimensional_path, "w", encoding="utf-8") as file:
file.write("\n".join(" ".join(map(str, row)) for row in rows))
with open(one_dimensional_path, "r", encoding="utf-8") as file:
print("Values:", file.read())
with open(two_dimensional_path, "r", encoding="utf-8") as file:
print("Rows:")
print(file.read())
每個 with 區塊結束時,檔案都會自動關閉,因此後續讀取只會在寫入完成後進行。產生文字時設定 encoding="utf-8",可明確指定編碼;若值包含非 ASCII 字元,這點尤其重要。以空格或換行分隔的格式容易檢視,但之後若要解析,就必須事先約定好該格式。
使用 NumPy 儲存並重新載入數值陣列
處理數值資料時,NumPy 提供 numpy.savetxt() 和 numpy.loadtxt(),可用來寫入及解析有明確規格的文字格式。儲存時設定分隔符號和數值格式,載入時則傳入相同的分隔符號。與列印陣列的表示方式不同,這種以分隔符號分列的格式是為數值交換而設計的。如需瞭解其他載入選項,請參閱 numpy.loadtxt() 參考資料。
以下範例會儲存一維和二維陣列。整數格式可避免這些值以科學記號表示,而逗號分隔符號則能清楚標示欄位:
本節中的程式碼以及顯示的標籤或輸出仍為英文。
from pathlib import Path
from tempfile import TemporaryDirectory
import numpy as np
values = np.array([23, 24, 25, 26, 28])
matrix = np.array([[23, 24, 25], [34, 45, 46]])
with TemporaryDirectory() as folder:
values_path = Path(folder) / "values.csv"
matrix_path = Path(folder) / "matrix.csv"
np.savetxt(values_path, values, delimiter=",", fmt="%d")
np.savetxt(matrix_path, matrix, delimiter=",", fmt="%d")
loaded_values = np.loadtxt(values_path, delimiter=",", dtype=int)
loaded_matrix = np.loadtxt(matrix_path, delimiter=",", dtype=int)
print("Values match:", np.array_equal(values, loaded_values))
print("Matrix matches:", np.array_equal(matrix, loaded_matrix))
請選擇能保留所需精確度的格式;"%d" 適用於整數,但若用於浮點資料,會捨棄小數部分。對於小數,可選擇合適的浮點格式,例如 "%.8f"。儲存和載入時必須使用相同的分隔符號。一維陣列會載入為一維結果,多列檔案則會載入為二維結果。文字檔容易閱讀且便於移植,但對大型數值陣列來說,相較於 NumPy 的二進位格式,檔案較大,解析速度也較慢。