HOWTO · Python
在 Python 中獲取副檔名
它演示瞭如何在 Python 中獲取副檔名。
本頁內容
在 Python 中取得檔名的副檔名時,只需要最後一段副檔名可使用 os.path.splitext();若需要多個副檔名部分,例如 .tar.bz2,則可使用 pathlib.Path.suffixes。以下範例會展示兩者結果的結構,方便你依照程式需求選擇。
在 Python 中使用 os.path 模組取得檔案副檔名
os.path 提供處理作業系統路徑的公用函式。它的 splitext() 函式會回傳包含兩個項目的 tuple:根路徑與最後一段副檔名。請依照這個順序指定 tuple 中的值,即使你使用不同的變數名稱也一樣。
請使用以 .docx 結尾的路徑執行這個範例:
本節中的程式碼以及顯示的標籤或輸出仍為英文。
import os
path = "/Users/user/Documents/sampledoc.docx"
root, extension = os.path.splitext(path)
print("Root:", root)
print("Extension:", extension)
Root: /Users/user/Documents/sampledoc
Extension: .docx
輸出會先顯示根路徑,再顯示副檔名。範例輸出中的標籤維持英文。splitext() 只會處理最後一段副檔名:例如檔名 backup.tar.gz 會將 .gz 分離出來,並將 backup.tar 保留在根路徑中。
splitext() 回傳的副檔名包含前置句點,方便進行 extension == ".csv" 這類比較。若檔名沒有副檔名,副檔名部分會是空字串,而根路徑則保留該檔名。單獨出現的前置句點不算副檔名,因此依照這項規則,.profile 這類名稱會被視為沒有副檔名。
在 Python 中使用 pathlib 模組取得檔案副檔名
pathlib 會以物件表示路徑。從路徑字串建立 Path,再查看它的屬性:parent 是所在路徑,name 是最後一個路徑元件,而 suffix 是包含前置句點的最後一段副檔名。
對於 sampledoc.docx 這類只有一段副檔名的檔案,path.suffix 會是 .docx。這些屬性本身就是值,讀取時不需要加上括號。以下獨立範例也會展示 suffix 和 suffixes 的差異:
本節中的程式碼以及顯示的標籤或輸出仍為英文。
import pathlib
single = pathlib.Path("/Users/user/Documents/sampledoc.docx")
archive = pathlib.Path("/Users/user/Documents/app_sample.tar.bz2")
print("Parent:", single.parent)
print("Filename:", single.name)
print("Final suffix:", single.suffix)
print("Suffix parts:", single.suffixes)
print("Archive suffix:", "".join(archive.suffixes))
Parent: /Users/user/Documents
Filename: sampledoc.docx
Final suffix: .docx
Suffix parts: ['.docx']
Archive suffix: .tar.bz2
輸出會依序顯示所在路徑、最後一個檔名、最後一段副檔名、副檔名清單,以及合併後的封存檔副檔名。suffixes 是清單:對 sampledoc.docx 而言,清單只有一個項目 .docx;對 app_sample.tar.bz2 而言,則包含 .tar 和 .bz2。將這些部分以空字串連接後,會得到 .tar.bz2。如果應用程式將複合副檔名視為一個整體,這種做法就很實用;不過,許多檔名只有一段副檔名。
路徑沒有副檔名時,Path.suffix 會是空字串,而 Path.suffixes 會是空清單。像 .profile 這樣只有前置句點的名稱,不會被回傳為副檔名。如果後續程式需要逐一檢查各個部分,請保留清單;只有在應用程式需要單一複合值時,才將它們連接起來。無論路徑目前是否指向已存在的檔案,這些屬性描述的都是路徑最後一個名稱元件。
若只需要最後一段副檔名,或同時需要根路徑,請選擇 os.path.splitext()。若使用物件導向的路徑並需要單一副檔名,請選擇 Path.suffix;若需要分別取得副檔名各部分,或將它們合併為複合值,則使用 Path.suffixes。這兩種做法都只會檢查名稱,不會確認檔案是否存在。