os.path — 常用路徑名操作

原始碼: Lib/genericpath.py, Lib/posixpath.py (用於 POSIX) 和 Lib/ntpath.py (用於 Windows)。


此模組實現了有關路徑名的一些有用的函式。 要讀取或寫入檔案,請參閱 open(),要訪問檔案系統,請參閱 os 模組。 路徑引數可以作為字串、位元組或任何實現 os.PathLike 協議的物件傳遞。

與 Unix shell 不同,Python 不執行任何自動路徑擴充套件。 當應用程式需要類似 shell 的路徑擴充套件時,可以顯式呼叫諸如 expanduser()expandvars() 之類的函式。(另請參閱 glob 模組。)

另請參閱

pathlib 模組提供高階路徑物件。

注意

所有這些函式都只接受位元組或字串物件作為其引數。 如果返回路徑或檔名,則結果是相同型別的物件。

注意

由於不同的作業系統具有不同的路徑名約定,因此標準庫中有此模組的多個版本。 os.path 模組始終是適合 Python 執行的作業系統使用的路徑模組,因此可用於本地路徑。 但是,如果您想操作始終採用不同格式之一的路徑,也可以匯入和使用各個模組。 它們都具有相同的介面

  • posixpath 用於 UNIX 樣式的路徑

  • ntpath 用於 Windows 路徑

在 3.8 版本中更改: exists(), lexists(), isdir(), isfile(), islink()ismount() 現在對於包含作業系統級別無法表示的字元或位元組的路徑返回 False,而不是引發異常。

os.path.abspath(path)

返回路徑名 path 的標準化絕對版本。 在大多數平臺上,這等效於呼叫函式 normpath(),如下所示:normpath(join(os.getcwd(), path))

在 3.6 版本中更改: 接受 類路徑物件

os.path.basename(path)

返回路徑名 path 的基本名稱。 這是將 path 傳遞給函式 split() 返回的對的第二個元素。 請注意,此函式的結果與 Unix basename 程式不同; 其中 '/foo/bar/'basename 返回 'bar',而 basename() 函式返回一個空字串 ('')。

在 3.6 版本中更改: 接受 類路徑物件

os.path.commonpath(paths)

返回可迭代物件 paths 中每個路徑名的最長公共子路徑。 如果 paths 包含絕對路徑名和相對路徑名,如果 paths 位於不同的驅動器上,或者如果 paths 為空,則引發 ValueError。 與 commonprefix() 不同,此函式返回一個有效的路徑。

在 3.5 版本中新增。

在 3.6 版本中更改: 接受 類路徑物件 序列。

在 3.13 版本中更改: 現在可以傳遞任何可迭代物件,而不僅僅是序列。

os.path.commonprefix(list)

返回 list 中所有路徑的字首的最長路徑字首(逐字元獲取)。 如果 list 為空,則返回空字串 ('')。

注意

此函式可能會返回無效路徑,因為它一次處理一個字元。 要獲得有效的路徑,請參閱 commonpath()

>>> os.path.commonprefix(['/usr/lib', '/usr/local/lib'])
'/usr/l'

>>> os.path.commonpath(['/usr/lib', '/usr/local/lib'])
'/usr'

在 3.6 版本中更改: 接受 類路徑物件

os.path.dirname(path)

返回路徑名 path 的目錄名稱。 這是將 path 傳遞給函式 split() 返回的對的第一個元素。

在 3.6 版本中更改: 接受 類路徑物件

os.path.exists(path)

如果 path 引用現有路徑或開啟的檔案描述符,則返回 True。 對於損壞的符號連結,返回 False。 在某些平臺上,如果未授予執行請求檔案上的 os.stat() 的許可權,即使 path 實際存在,此函式也可能返回 False

在 3.3 版本中更改: path 現在可以是一個整數:如果它是一個開啟的檔案描述符,則返回 True,否則返回 False

在 3.6 版本中更改: 接受 類路徑物件

os.path.lexists(path)

如果 path 引用現有路徑(包括損壞的符號連結),則返回 True。 在缺少 os.lstat() 的平臺上,等效於 exists()

在 3.6 版本中更改: 接受 類路徑物件

os.path.expanduser(path)

在 Unix 和 Windows 系統上,將引數中以 ~~user 開頭的初始部分替換為該使用者的主目錄並返回。

在 Unix 系統上,如果設定了環境變數 HOME,則初始的 ~ 將被替換為該環境變數的值;否則,將透過內建模組 pwd 在密碼目錄中查詢當前使用者的主目錄。初始的 ~user 將直接在密碼目錄中查詢。

在 Windows 系統上,如果設定了環境變數 USERPROFILE,則將使用該環境變數的值,否則將使用 HOMEPATHHOMEDRIVE 的組合。對於初始的 ~user,將檢查當前使用者主目錄的最後一個目錄元件是否與 USERNAME 匹配,如果匹配則進行替換。

如果展開失敗,或者路徑不是以波浪號開頭,則路徑將保持不變並返回。

在 3.6 版本中更改: 接受 類路徑物件

在 3.8 版本中更改: 不再在 Windows 上使用 HOME

os.path.expandvars(path)

返回展開了環境變數的引數。形如 $name${name} 的子字串將被替換為環境變數 *name* 的值。格式錯誤的變數名和對不存在的變數的引用將保持不變。

在 Windows 系統上,除了 $name${name} 之外,還支援 %name% 展開。

在 3.6 版本中更改: 接受 類路徑物件

os.path.getatime(path)

返回 *path* 的最後訪問時間。返回值是一個浮點數,表示自 epoch(請參閱 time 模組)以來的秒數。如果檔案不存在或不可訪問,則引發 OSError 異常。

os.path.getmtime(path)

返回 *path* 的最後修改時間。返回值是一個浮點數,表示自 epoch(請參閱 time 模組)以來的秒數。如果檔案不存在或不可訪問,則引發 OSError 異常。

在 3.6 版本中更改: 接受 類路徑物件

os.path.getctime(path)

返回系統的 ctime,在某些系統(如 Unix)上,它是最後一次元資料更改的時間,而在另一些系統(如 Windows)上,它是 *path* 的建立時間。返回值是一個數字,表示自 epoch(請參閱 time 模組)以來的秒數。如果檔案不存在或不可訪問,則引發 OSError 異常。

在 3.6 版本中更改: 接受 類路徑物件

os.path.getsize(path)

返回 *path* 的大小,以位元組為單位。如果檔案不存在或不可訪問,則引發 OSError 異常。

在 3.6 版本中更改: 接受 類路徑物件

os.path.isabs(path)

如果 *path* 是絕對路徑名,則返回 True。在 Unix 系統上,這意味著它以斜槓開頭;在 Windows 系統上,這意味著它以兩個(反)斜槓開頭,或者以驅動器號、冒號和(反)斜槓一起開頭。

在 3.6 版本中更改: 接受 類路徑物件

在 3.13 版本中更改: 在 Windows 系統上,如果給定的路徑恰好以一個(反)斜槓開頭,則返回 False

os.path.isfile(path)

如果 *path* 是一個存在的普通檔案,則返回 True。這會跟隨符號連結,因此對於同一路徑,islink()isfile() 都可能為 True。

在 3.6 版本中更改: 接受 類路徑物件

os.path.isdir(path)

如果 *path* 是一個存在的目錄,則返回 True。這會跟隨符號連結,因此對於同一路徑,islink()isdir() 都可能為 True。

在 3.6 版本中更改: 接受 類路徑物件

os.path.isjunction(path)

如果 *path* 指向一個存在的目錄條目且該條目是連線點,則返回 True。如果當前平臺不支援連線點,則始終返回 False

3.12 版本新增。

如果 *path* 指向一個存在的目錄條目且該條目是符號連結,則返回 True。如果 Python 執行時不支援符號連結,則始終返回 False

在 3.6 版本中更改: 接受 類路徑物件

os.path.ismount(path)

如果路徑名 *path* 是一個掛載點,則返回 True:檔案系統中一個已掛載不同檔案系統的點。在 POSIX 系統上,該函式檢查 *path* 的父級 path/.. 是否與 *path* 位於不同的裝置上,或者 path/.. 和 *path* 是否指向同一裝置上的同一 i 節點——這應該檢測到所有 Unix 和 POSIX 變體的掛載點。它無法可靠地檢測同一檔案系統上的繫結掛載。在 Windows 系統上,驅動器號根目錄和共享 UNC 始終是掛載點,對於任何其他路徑,將呼叫 GetVolumePathName 來檢視它是否與輸入路徑不同。

在 3.4 版本中更改: 增加了對檢測 Windows 上非根掛載點的支援。

在 3.6 版本中更改: 接受 類路徑物件

os.path.isdevdrive(path)

如果路徑名 *path* 位於 Windows 開發驅動器上,則返回 True。開發驅動器針對開發人員場景進行了最佳化,併為讀寫檔案提供了更快的效能。建議將其用於原始碼、臨時構建目錄、包快取和其他 IO 密集型操作。

對於無效路徑(例如,無法識別的驅動器),可能會引發錯誤,但在不支援 Dev Drive 的平臺上會返回 False。有關啟用和建立 Dev Drive 的資訊,請參閱Windows 文件

3.12 版本新增。

3.13 版本更改: 該函式現在在所有平臺上都可用,並且在不支援 Dev Drive 的平臺上將始終返回 False

os.path.isreserved(path)

如果 path 是當前系統上的保留路徑名,則返回 True

在 Windows 上,保留檔名包括以空格或點結尾的檔名;包含冒號(即“name:stream”等檔案流)、萬用字元(即 '*?"<>')、管道或 ASCII 控制字元的檔名;以及 DOS 裝置名稱,例如 “NUL”、“CON”、“CONIN$”、“CONOUT$”、“AUX”、“PRN”、“COM1” 和 “LPT1”。

注意

此函式近似於大多數 Windows 系統上保留路徑的規則。這些規則在各種 Windows 版本中會隨時間變化。隨著規則的更改被廣泛使用,此函式可能會在未來的 Python 版本中更新。

可用性:Windows。

3.13 版本中新增。

os.path.join(path, *paths)

智慧地連線一個或多個路徑段。返回值是 path*paths 的所有成員的串聯,每個非空部分後跟一個目錄分隔符,但最後一個除外。也就是說,只有當最後一部分為空或以分隔符結尾時,結果才會以分隔符結尾。如果某個段是絕對路徑(在 Windows 上需要驅動器和根目錄),則所有先前的段都將被忽略,並且連線將從該絕對路徑段繼續。

在 Windows 上,當遇到根路徑段(例如,r'\foo')時,驅動器不會重置。如果某個段在不同的驅動器上或是一個絕對路徑,則所有先前的段都將被忽略,並且驅動器將被重置。請注意,由於每個驅動器都有一個當前目錄,os.path.join("c:", "foo") 表示相對於驅動器 C: 上的當前目錄的路徑 (c:foo),而不是 c:\foo

3.6 版本更改: 接受 pathpaths類路徑物件

os.path.normcase(path)

規範化路徑名的大小寫。在 Windows 上,將路徑名中的所有字元轉換為小寫,並將正斜槓轉換為反斜槓。在其他作業系統上,返回路徑不變。

在 3.6 版本中更改: 接受 類路徑物件

os.path.normpath(path)

透過摺疊冗餘分隔符和向上級引用來規範化路徑名,使 A//BA/B/A/./BA/foo/../B 都變為 A/B。此字串操作可能會更改包含符號連結的路徑的含義。在 Windows 上,它將正斜槓轉換為反斜槓。要規範化大小寫,請使用 normcase()

注意

在 POSIX 系統上,根據 IEEE Std 1003.1 2013 Edition; 4.13 Pathname Resolution,如果路徑名以兩個斜槓開頭,則前導字元之後的第一個元件可以以實現定義的方式解釋,但兩個以上的引導字元應被視為單個字元。

在 3.6 版本中更改: 接受 類路徑物件

os.path.realpath(path, *, strict=False)

返回指定檔名的規範路徑,消除路徑中遇到的任何符號連結(如果作業系統支援)。在 Windows 上,此函式還將解析 MS-DOS(也稱為 8.3)樣式名稱,例如 C:\\PROGRA~1C:\\Program Files

如果路徑不存在或遇到符號連結迴圈,並且 strictTrue,則會引發 OSError。如果 strictFalse,則會忽略這些錯誤,因此結果可能會缺失或無法訪問。

注意

此函式模擬作業系統用於生成規範路徑的過程,該過程在 Windows 和 UNIX 之間關於連結和後續路徑元件如何互動略有不同。

作業系統 API 會根據需要生成規範路徑,因此通常不需要呼叫此函式。

在 3.6 版本中更改: 接受 類路徑物件

3.8 版本更改: 現在在 Windows 上解析符號連結和連線點。

3.10 版本更改: 添加了 strict 引數。

os.path.relpath(path, start=os.curdir)

返回從當前目錄或可選的 start 目錄到 path 的相對檔案路徑。這是一個路徑計算:不會訪問檔案系統來確認 pathstart 的存在或性質。在 Windows 上,當 pathstart 在不同的驅動器上時,會引發 ValueError

start 預設為 os.curdir

在 3.6 版本中更改: 接受 類路徑物件

os.path.samefile(path1, path2)

如果兩個路徑名引數引用同一檔案或目錄,則返回 True。這由裝置號和 i 節點號確定,如果對任一路徑名的 os.stat() 呼叫失敗,則會引發異常。

3.2 版本更改: 添加了 Windows 支援。

3.4 版本更改: Windows 現在使用與所有其他平臺相同的實現。

在 3.6 版本中更改: 接受 類路徑物件

os.path.sameopenfile(fp1, fp2)

如果檔案描述符 fp1fp2 引用同一檔案,則返回 True

3.2 版本更改: 添加了 Windows 支援。

在 3.6 版本中更改: 接受 類路徑物件

os.path.samestat(stat1, stat2)

如果 stat 元組 stat1stat2 引用同一檔案,則返回 True。這些結構可能由 os.fstat()os.lstat()os.stat() 返回。此函式實現 samefile()sameopenfile() 使用的底層比較。

3.4 版本更改: 添加了 Windows 支援。

在 3.6 版本中更改: 接受 類路徑物件

os.path.split(path)

將路徑名 path 分割成一對,(head, tail),其中 tail 是最後一個路徑元件,而 head 是它之前的所有內容。tail 部分永遠不會包含斜槓;如果 path 以斜槓結尾,則 tail 將為空。如果 path 中沒有斜槓,則 head 將為空。如果 path 為空,則 headtail 都為空。除非 head 是根目錄(僅一個或多個斜槓),否則會從 head 中刪除尾部的斜槓。在所有情況下,join(head, tail) 返回的路徑與 path 指向的相同位置(但字串可能不同)。另請參閱函式 dirname()basename()

在 3.6 版本中更改: 接受 類路徑物件

os.path.splitdrive(path)

將路徑名 path 分割成一對 (drive, tail),其中 drive 是掛載點或空字串。在不使用驅動器規範的系統上,drive 將始終為空字串。在所有情況下,drive + tail 將與 path 相同。

在 Windows 上,將路徑名分割為驅動器/UNC 共享點和相對路徑。

如果路徑包含驅動器號,則 drive 將包含直到冒號(包括冒號)的所有內容

>>> splitdrive("c:/dir")
("c:", "/dir")

如果路徑包含 UNC 路徑,則 drive 將包含主機名和共享名

>>> splitdrive("//host/computer/dir")
("//host/computer", "/dir")

在 3.6 版本中更改: 接受 類路徑物件

os.path.splitroot(path)

將路徑名 path 分割成一個 3 項元組 (drive, root, tail),其中 drive 是裝置名稱或掛載點,root 是驅動器後的分隔符字串,而 tail 是根之後的所有內容。這些項中的任何一項都可能為空字串。在所有情況下,drive + root + tail 將與 path 相同。

在 POSIX 系統上,drive 始終為空。root 可以為空(如果 path 是相對路徑)、單個正斜槓(如果 path 是絕對路徑)或兩個正斜槓(根據 IEEE Std 1003.1-2017; 4.13 路徑名解析,實現定義)。例如

>>> splitroot('/home/sam')
('', '/', 'home/sam')
>>> splitroot('//home/sam')
('', '//', 'home/sam')
>>> splitroot('///home/sam')
('', '/', '//home/sam')

在 Windows 上,drive 可以為空、驅動器號名稱、UNC 共享或裝置名稱。root 可以為空、正斜槓或反斜槓。例如

>>> splitroot('C:/Users/Sam')
('C:', '/', 'Users/Sam')
>>> splitroot('//Server/Share/Users/Sam')
('//Server/Share', '/', 'Users/Sam')

3.12 版本新增。

os.path.splitext(path)

將路徑名 path 分割成一對 (root, ext),使得 root + ext == path,並且副檔名 ext 為空,或者以句點開頭並且最多包含一個句點。

如果路徑不包含副檔名,則 ext 將為 ''

>>> splitext('bar')
('bar', '')

如果路徑包含副檔名,則 ext 將設定為此副檔名,包括前導句點。請注意,之前的句點將被忽略

>>> splitext('foo.bar.exe')
('foo.bar', '.exe')
>>> splitext('/foo/bar.exe')
('/foo/bar', '.exe')

路徑最後一個元件的前導句點被認為是根的一部分

>>> splitext('.cshrc')
('.cshrc', '')
>>> splitext('/foo/....jpg')
('/foo/....jpg', '')

在 3.6 版本中更改: 接受 類路徑物件

os.path.supports_unicode_filenames

如果任意 Unicode 字串可以用作檔名(在檔案系統施加的限制內),則為 True