HOWTO · Python
在 Python 中從路徑中獲取目錄
本教程演示如何在 Python 中提取檔案路徑的一部分。
本頁內容
若要從檔案路徑取得父目錄,請將路徑傳給 os.path.dirname()。另一種物件導向的寫法是使用 pathlib 的 Path(file_path).parent。這兩種方式都會回傳檔案所在的目錄,不會回傳程序目前的工作目錄。
範例使用正斜線路徑,讓結果更容易閱讀。Python 的路徑函式會依照主機作業系統解讀路徑。當路徑元件來自不同值時,請使用 os.path.join() 或 pathlib 組合路徑,不要手動插入分隔符號。
了解路徑分隔符號
路徑會以平台專用的分隔符號隔開目錄名稱與最後一個元件。POSIX 系統通常使用 /;Windows 路徑通常使用 \\,而且許多 Windows 路徑操作也接受 /。os.sep 會提供目前平台使用的分隔符號。一般處理路徑時,將路徑傳給 os.path 或使用 pathlib 即可,不必自行依分隔符號撰寫不同分支。
使用 os.path.basename 取得檔名
os.path.basename() 會回傳路徑的最後一個元件。對檔案路徑而言,這通常是包含副檔名的檔名;它不會回傳目錄。若要取得檔案路徑中最後一層目錄的名稱,請先用 os.path.dirname() 取得父目錄,再將結果傳給 os.path.basename()。
import os
file_path = "/home/user/documents/report.txt"
filename = os.path.basename(file_path)
parent_directory = os.path.dirname(file_path)
last_directory = os.path.basename(parent_directory)
print(filename)
print(last_directory)
report.txt
documents
使用 os.path.splitext 分離檔名與副檔名
os.path.splitext() 會將路徑最後一個元件的副檔名與其餘部分分開,並回傳 (root, ext) 配對。副檔名可能是空字串,也可能以句點開頭;此函式不會回傳目錄。若需要的是目錄,請使用 os.path.dirname()。
import os
file_path = "/home/user/documents/report.txt"
root, extension = os.path.splitext(file_path)
directory = os.path.dirname(file_path)
print(root)
print(extension)
print(directory)
/home/user/documents/report
.txt
/home/user/documents
例如檔名 archive.tar.gz,splitext() 只會分離最後一個副檔名 .gz。回傳的根名稱仍包含 archive.tar,因此處理副檔名時,應配合應用程式所採用的命名慣例。
使用 os.path.dirname 從檔案路徑取得目錄
os.path.dirname() 會以字串形式回傳路徑中的目錄部分。如果你已有路徑字串,並想取得最後一個元件的父目錄,這就是直接的做法。此連結目前指向清單中有提供的英文 API 頁面;清單未列出繁體中文版本。
import os
file_path = "/home/user/documents/report.txt"
directory = os.path.dirname(file_path)
print(directory)
/home/user/documents
輸入變數與函式呼叫請使用相同的變數。此函式只處理路徑文字,不會檢查檔案或目錄是否存在。如果你需要建立、列出或檢查目錄,請另外使用相應的檔案系統操作。
使用 pathlib 取得父目錄
pathlib 提供用於路徑操作的 Path 物件。Path.parent 屬性會以另一個 Path 物件回傳父路徑;在串接路徑操作,或將路徑傳給接受路徑類型值的 API 時,這種方式可能更方便。
from pathlib import Path
file_path = Path("/home/user/documents/report.txt")
parent_directory = file_path.parent
print(parent_directory)
print(file_path.parts)
/home/user/documents
('/', 'home', 'user', 'documents', 'report.txt')
Path.parts 是包含路徑各個元件的 tuple,屬於屬性而非函式。要取得父目錄,請選用 Path.parent;若需要檢視或依索引存取個別元件,則使用 parts。
解析相對路徑並取得目前工作目錄
相對路徑是以程序目前的工作目錄為起點解讀。 os.path.abspath() 會以該工作目錄為基準,將相對路徑轉換成絕對路徑。若要取得轉換後路徑所在的目錄,請將結果傳給 os.path.dirname()。此連結目前指向清單中有提供的英文 API 頁面;清單未列出繁體中文版本。
import os
relative_path = "documents/report.txt"
absolute_path = os.path.abspath(relative_path)
file_directory = os.path.dirname(absolute_path)
print(absolute_path)
print(file_directory)
/work/documents/report.txt
/work/documents
Path.cwd() 會以 Path 物件回傳目前工作目錄,而 os.getcwd() 會以字串回傳目前工作目錄。它們描述的是程序的工作目錄,這個目錄可能與 Python 腳本所在的目錄不同。若要確認相對路徑的起點,請使用這些方法;若要在腳本中取得腳本所在的目錄,請使用 Path(__file__).parent。
import os
from pathlib import Path
print(Path.cwd())
print(os.getcwd())
/work
/work