HOWTO · Python

Python 從路徑獲取不帶副檔名的檔名

本教程演示瞭如何在 Python 中從檔案路徑中獲取不帶副檔名的檔名。

本頁內容

若要從路徑取得不含最後一個副檔名的檔名,請使用 Path(file_path).stem。例如,路徑 Desktop/folder/myfile.txt 的 stem 是 myfile。Path.stem 是屬性,存取時不加括號。以下範例會使用路徑字串並印出結果名稱。

使用 Path.stem 取得不含最後一個副檔名的檔名

pathlib.Path 會依目前平台處理路徑分隔符,因此不必自行拆分路徑。先從字串建立 Path,再讀取它的 stem 屬性。這會移除最後一個副檔名,同時保留檔名中較前面的句點。

執行以下範例:

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

from pathlib import Path

file_path = "Desktop/folder/myfile.txt"
file_name = Path(file_path).stem
print(file_name)
myfile

使用 os.path.splitext() 移除最後一個副檔名

標準函式庫中的 os.path.splitext() 會回傳一組配對值:最後一個副檔名之前的路徑部分,以及副檔名本身。取第一個值即可移除該副檔名。若還需要取得最後一個路徑元件,這個範例可以用 / 拆分字串,但這種寫法綁定特定分隔符,在不同作業系統間較不具可攜性。

執行以下範例:

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

import os

file_path = "Desktop/folder/myfile.txt"
path_without_suffix = os.path.splitext(file_path)[0]
file_name = path_without_suffix.split("/")[-1]
print(file_name)
myfile

先取得基名,再移除副檔名

若要使用能處理路徑的 os.path 寫法,請先呼叫 os.path.basename() 取得最後一個路徑元件,再將結果傳給 os.path.splitext()。Desktop/folder/myfile.txt 的基名是 myfile.txt;移除最後一個副檔名後會得到 myfile。這種寫法不必手動選擇路徑分隔符。

執行以下範例:

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

import os

file_path = "Desktop/folder/myfile.txt"
basename = os.path.basename(file_path)
file_name = os.path.splitext(basename)[0]
print(file_name)
myfile

處理複合副檔名與檔名中的句點

這些標準寫法只會移除最後一個副檔名,不會移除所有以句點分隔的部分。對於 myfile.tar.gz,Path.stem 和 os.path.splitext() 都會得到 myfile.tar。若只有 .gz 是副檔名,這正是所需結果。若應用程式將 .tar.gz 視為一個複合副檔名,請明確處理這個已知副檔名,例如使用 name.removesuffix(".tar.gz")。str.removesuffix() 是從 Python 3.9 開始提供,因此這個運算式需要 Python 3.9 或更新版本。較舊版本可使用 name[:-len(".tar.gz")] if name.endswith(".tar.gz") else name,安全地移除完全相符的結尾。

沒有副檔名的名稱(例如 README)經 Path.stem 和 os.path.splitext() 處理後仍是 README。以句點開頭的名稱(例如 .bashrc)會被視為沒有副檔名的點檔:Path(".bashrc").stem 和 os.path.splitext(".bashrc")[0] 都會回傳 .bashrc。相較之下,archive. 的結尾有句點:Path.stem 會保留句點並得到 archive.,而 os.path.splitext() 會將句點視為副檔名並回傳 archive。

從第一個句點開始拆分會得到不同結果:它會截斷名稱後續內容。對 my.file.tar.gz 而言,從第一個句點拆分會得到 my,而只移除最後一個副檔名則會得到 my.file.tar。請依需求選擇:移除已知的複合副檔名、只移除最後一個副檔名,或移除第一個句點之後的所有內容。從第一個句點拆分也會讓 .bashrc 變成空字串,因此若要保留以句點開頭的名稱,就不適合採用這種方式。

執行以下範例:

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

from pathlib import Path

for name in ("myfile.tar.gz", "my.file.tar.gz"):
    print(Path(name).stem)
    print(name.split(".", 1)[0])
myfile.tar
myfile
my.file.tar
my