HOWTO · Pandas
使用 Python 將 Pandas DataFrame 儲存為 HTML
本教程演示如何將 Pandas DataFrame 轉換為 Python 中的 HTML 表格。
本頁內容
pandas 的 DataFrame 可以直接轉成 HTML 表格,因此不必自行建立每個儲存格。to_html() 可以回傳標記字串,也可以將標記寫入指定位置。以下範例會建立一個小型表格並儲存至暫存檔,因此不需要輸入 CSV 檔案或事先建立資料夾。
使用 to_html() 將 DataFrame 儲存為 HTML 檔案
執行以下範例:
本節中的程式碼以及顯示的標籤或輸出仍為英文。
from pathlib import Path
from tempfile import TemporaryDirectory
import pandas as pd
df = pd.DataFrame(
{
"ST_Name": ["Jhon", "Alia", "Sam", "Smith"],
"Department": ["CS", "EE", "EE", "CS"],
"Marks": [60, 80, 90, 88],
}
)
with TemporaryDirectory() as folder:
html_path = Path(folder) / "students.html"
df.to_html(html_path)
print(f"HTML file created: {html_path.is_file()}")
將目的地傳給 to_html(),就會將表格寫入該處。此方法預設會包含 DataFrame 的索引;如果不希望 HTML 表格顯示列號,請傳入 index=False。若索引包含讀者需要查看的重要識別值,請保留索引。
選擇輸出路徑並檢視產生的 HTML
相對檔名如 students.html 會以 Python 的目前工作目錄為基準解析。若要指定其他位置,可以傳入 reports/students.html 之類的路徑;該目錄必須已經存在。絕對路徑則會指向特定位置,不受目前目錄影響。在範例中,TemporaryDirectory 會提供一個已存在的目錄,而 Path 則以跨平台的方式組合目的地路徑。
若要檢視結果,可以用瀏覽器開啟儲存的檔案,或將它當作文字讀取。pandas 會產生包含 <thead> 欄標題與 <tbody> 資料列的 <table>。索引設定採用預設值時,表格中也會呈現每一列的索引。產生的標記包含表格資料,但不是外層帶有 <html> 文件的完整網頁。如果只需要記憶體中的標記,可以不指定目的地,直接呼叫 df.to_html();此時會回傳 HTML 字串,而不會寫入檔案。接著可以將該字串傳給程式的其他部分,或使用自己的檔案處理程式碼寫入檔案。
手動建立 HTML 表格
當你需要精確控制哪些值要成為儲存格,或要將表格與其他產生的標記組合時,手動建立會很有用。若是一般的 DataFrame 匯出,to_html() 寫法較精簡,也會替你處理表格結構。自行組合標記時,請跳脫每個欄標題與儲存格的值,讓 <、> 和 & 等字元保留為文字,而不會被解讀成 HTML。範例會分別建立表頭區段與表身區段,並將結果寫入暫存檔:
本節中的程式碼以及顯示的標籤或輸出仍為英文。
from html import escape
from pathlib import Path
from tempfile import TemporaryDirectory
import pandas as pd
df = pd.DataFrame(
{
"ST_Name": ["Jhon", "Alia", "Sam", "Smith"],
"Department": ["CS", "EE", "EE", "CS"],
"Marks": [60, 80, 90, 88],
}
)
headings = "".join(f"<th>{escape(str(column))}</th>" for column in df.columns)
rows = []
for row in df.itertuples(index=False, name=None):
cells = "".join(f"<td>{escape(str(value))}</td>" for value in row)
rows.append(f"<tr>{cells}</tr>")
markup = f"<table><thead><tr>{headings}</tr></thead><tbody>{''.join(rows)}</tbody></table>"
with TemporaryDirectory() as folder:
html_path = Path(folder) / "students.html"
html_path.write_text(markup, encoding="utf-8")
print(f"HTML file created: {html_path.is_file()}")
這個手動版本刻意不包含 DataFrame 的索引,與表頭中明確列出的資料欄相符。如果索引也是讀者需要查看的表格內容,請自行加入索引欄。這兩種方式都會產生可用文字檢視的 HTML 原始碼;儲存的檔案是表格標記,不是 DataFrame 的螢幕截圖。