os.path --- 常用路徑操作?

Source code: Lib/posixpath.py (for POSIX) and Lib/ntpath.py (for Windows).


This module implements some useful functions on pathnames. To read or write files see open(), and for accessing the filesystem see the os module. The path parameters can be passed as strings, or bytes, or any object implementing the os.PathLike protocol.

與unix shell不同,Python不執行任何 自動(dòng) 路徑擴展。當應用程序需要類(lèi)似shell的路徑擴展時(shí),可以顯式調用諸如 expanduser()expandvars() 之類(lèi)的函數。 (另請參見(jiàn) glob 模塊。)

參見(jiàn)

pathlib 模塊提供高級路徑對象。

備注

所有這些函數都僅接受字節或字符串對象作為其參數。如果返回路徑或文件名,則結果是相同類(lèi)型的對象。

備注

由于不同的操作系統具有不同的路徑名稱(chēng)約定,因此標準庫中有此模塊的幾個(gè)版本。os.path 模塊始終是適合 Python 運行的操作系統的路徑模塊,因此可用于本地路徑。但是,如果操作的路徑 總是 以一種不同的格式顯示,那么也可以分別導入和使用各個(gè)模塊。它們都具有相同的接口:

  • posixpath 用于Unix 樣式的路徑

  • ntpath 用于 Windows 路徑

在 3.8 版更改: exists()、lexists()、isdir()、isfile()、islink()ismount() 現在遇到系統層面上不可表示的字符或字節的路徑時(shí),會(huì )返回 False,而不是拋出異常。

os.path.abspath(path)?

返回路徑 path 的絕對路徑(標準化的)。在大多數平臺上,這等同于用 normpath(join(os.getcwd(), path)) 的方式調用 normpath() 函數。

在 3.6 版更改: 接受一個(gè) path-like object。

os.path.basename(path)?

返回路徑 path 的基本名稱(chēng)。這是將 path 傳入函數 split() 之后,返回的一對值中的第二個(gè)元素。請注意,此函數的結果與Unix basename 程序不同。basename'/foo/bar/' 上返回 'bar',而 basename() 函數返回一個(gè)空字符串 ('')。

在 3.6 版更改: 接受一個(gè) path-like object。

os.path.commonpath(paths)?

接受包含多個(gè)路徑的序列 paths,返回 paths 的最長(cháng)公共子路徑。如果 paths 同時(shí)包含絕對路徑和相對路徑,或 paths 在不同的驅動(dòng)器上,或 paths 為空,則拋出 ValueError 異常。與 commonprefix() 不同,本方法返回有效路徑。

可用性: Unix, Windows。

3.5 新版功能.

在 3.6 版更改: 接受一個(gè) 類(lèi)路徑對象 序列。

os.path.commonprefix(list)?

接受包含多個(gè)路徑的 列表,返回所有路徑的最長(cháng)公共前綴(逐字符比較)。如果 列表 為空,則返回空字符串 ('')。

備注

此函數是逐字符比較,因此可能返回無(wú)效路徑。要獲取有效路徑,參見(jiàn) commonpath()。

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

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

在 3.6 版更改: 接受一個(gè) path-like object。

os.path.dirname(path)?

返回路徑 path 的目錄名稱(chēng)。這是將 path 傳入函數 split() 之后,返回的一對值中的第一個(gè)元素。

在 3.6 版更改: 接受一個(gè) path-like object。

os.path.exists(path)?

如果 path 指向一個(gè)已存在的路徑或已打開(kāi)的文件描述符,返回 True。對于失效的符號鏈接,返回 False。在某些平臺上,如果使用 os.stat() 查詢(xún)到目標文件沒(méi)有執行權限,即使 path 確實(shí)存在,本函數也可能返回 False。

在 3.3 版更改: path 現在可以是一個(gè)整數:如果該整數是一個(gè)已打開(kāi)的文件描述符,返回 True,否則返回 False。

在 3.6 版更改: 接受一個(gè) path-like object。

os.path.lexists(path)?

如果 path 指向一個(gè)已存在的路徑,返回 True。對于失效的符號鏈接,也返回 True。在缺失 os.lstat() 的平臺上等同于 exists()。

在 3.6 版更改: 接受一個(gè) path-like object。

os.path.expanduser(path)?

在 Unix 和 Windows 上,將參數中開(kāi)頭部分的 ~~user 替換為當前 用戶(hù) 的家目錄并返回。

在 Unix 上,開(kāi)頭的 ~ 會(huì )被環(huán)境變量 HOME 代替,如果變量未設置,則通過(guò)內置模塊 pwd 在 password 目錄中查找當前用戶(hù)的主目錄。以 ~user 開(kāi)頭則直接在 password 目錄中查找。

在 Windows 上,如果 USERPROFILE 已設置將會(huì )被使用,否則 HOMEPATHHOMEDRIVE 將被組合起來(lái)使用。 初始的 ~user 會(huì )通過(guò)檢查當前用戶(hù)的家目錄中匹配 USERNAME 的最后一部分目錄名并執行替換來(lái)處理。

如果展開(kāi)路徑失敗,或者路徑不是以波浪號開(kāi)頭,則路徑將保持不變。

在 3.6 版更改: 接受一個(gè) path-like object。

在 3.8 版更改: Windows 不再使用 HOME。

os.path.expandvars(path)?

輸入帶有環(huán)境變量的路徑作為參數,返回展開(kāi)變量以后的路徑。$name${name} 形式的子字符串被環(huán)境變量 name 的值替換。格式錯誤的變量名稱(chēng)和對不存在變量的引用保持不變。

在 Windows 上,除了 $name${name} 外,還可以展開(kāi) %name%。

在 3.6 版更改: 接受一個(gè) path-like object。

os.path.getatime(path)?

返回 path 的最后訪(fǎng)問(wèn)時(shí)間。返回值是一個(gè)浮點(diǎn)數,為紀元秒數(參見(jiàn) time 模塊)。如果該文件不存在或不可訪(fǎng)問(wèn),則拋出 OSError 異常。

os.path.getmtime(path)?

返回 path 的最后修改時(shí)間。返回值是一個(gè)浮點(diǎn)數,為紀元秒數(參見(jiàn) time 模塊)。如果該文件不存在或不可訪(fǎng)問(wèn),則拋出 OSError 異常。

在 3.6 版更改: 接受一個(gè) path-like object。

os.path.getctime(path)?

返回 path 在系統中的 ctime,在有些系統(比如 Unix)上,它是元數據的最后修改時(shí)間,其他系統(比如 Windows)上,它是 path 的創(chuàng )建時(shí)間。返回值是一個(gè)數,為紀元秒數(參見(jiàn) time 模塊)。如果該文件不存在或不可訪(fǎng)問(wèn),則拋出 OSError 異常。

在 3.6 版更改: 接受一個(gè) path-like object。

os.path.getsize(path)?

返回 path 的大小,以字節為單位。如果該文件不存在或不可訪(fǎng)問(wèn),則拋出 OSError 異常。

在 3.6 版更改: 接受一個(gè) path-like object。

os.path.isabs(path)?

如果 path 是一個(gè)絕對路徑,則返回 True。在 Unix 上,它就是以斜杠開(kāi)頭,而在 Windows 上,它可以是去掉驅動(dòng)器號后以斜杠(或反斜杠)開(kāi)頭。

在 3.6 版更改: 接受一個(gè) path-like object。

os.path.isfile(path)?

如果 path現有的 常規文件,則返回 True。本方法會(huì )跟蹤符號鏈接,因此,對于同一路徑,islink()isfile() 都可能為 True。

在 3.6 版更改: 接受一個(gè) path-like object。

os.path.isdir(path)?

如果 path現有的 目錄,則返回 True。本方法會(huì )跟蹤符號鏈接,因此,對于同一路徑,islink()isdir() 都可能為 True。

在 3.6 版更改: 接受一個(gè) path-like object。

如果 path 指向的 現有 目錄條目是一個(gè)符號鏈接,則返回 True。如果 Python 運行時(shí)不支持符號鏈接,則總是返回 False。

在 3.6 版更改: 接受一個(gè) path-like object。

os.path.ismount(path)?

如果路徑 path掛載點(diǎn) (文件系統中掛載其他文件系統的點(diǎn)),則返回 True。在 POSIX 上,該函數檢查 path 的父目錄 path/.. 是否在與 path 不同的設備上,或者 path/..path 是否指向同一設備上的同一 inode(這一檢測掛載點(diǎn)的方法適用于所有 Unix 和 POSIX 變體)。本方法不能可靠地檢測同一文件系統上的綁定掛載 (bind mount)。在 Windows 上,盤(pán)符和共享 UNC 始終是掛載點(diǎn),對于任何其他路徑,將調用 GetVolumePathName 來(lái)查看它是否與輸入的路徑不同。

3.4 新版功能: 支持在 Windows 上檢測非根掛載點(diǎn)。

在 3.6 版更改: 接受一個(gè) path-like object。

os.path.join(path, *paths)?

智能地拼接一個(gè)或多個(gè)路徑部分。 返回值是 path*paths 的所有成員的拼接,其中每個(gè)非空部分后面都緊跟一個(gè)目錄分隔符,最后一個(gè)部分除外,這意味著(zhù)如果最后一個(gè)部分為空,則結果將以分隔符結尾。 如果某個(gè)部分為絕對路徑,則之前的所有部分會(huì )被丟棄并從絕對路徑部分開(kāi)始繼續拼接。

在 Windows 上,遇到絕對路徑部分(例如 r'\foo')時(shí),不會(huì )重置盤(pán)符。如果某部分路徑包含盤(pán)符,則會(huì )丟棄所有先前的部分,并重置盤(pán)符。請注意,由于每個(gè)驅動(dòng)器都有一個(gè)“當前目錄”,所以 os.path.join("c:", "foo") 表示驅動(dòng)器 C: 上當前目錄的相對路徑 (c:foo),而不是 c:\foo。

在 3.6 版更改: 接受一個(gè) 類(lèi)路徑對象 用于 pathpaths 。

os.path.normcase(path)?

規范路徑的大小寫(xiě)。在 Windows 上,將路徑中的所有字符都轉換為小寫(xiě),并將正斜杠轉換為反斜杠。在其他操作系統上返回原路徑。

在 3.6 版更改: 接受一個(gè) path-like object。

os.path.normpath(path)?

通過(guò)折疊多余的分隔符和對上級目錄的引用來(lái)標準化路徑名,所以 A//B、A/B/、A/./BA/foo/../B 都會(huì )轉換成 A/B。這個(gè)字符串操作可能會(huì )改變帶有符號鏈接的路徑的含義。在 Windows 上,本方法將正斜杠轉換為反斜杠。要規范大小寫(xiě),請使用 normcase()。

備注

在 POSIX 系統上,根據 IEEE Std 1003.1 2013 Edition; 4.13 Pathname Resolution,如果一個(gè)路徑名稱(chēng)以?xún)蓚€(gè)斜杠開(kāi)始,則開(kāi)始字符之后的第一個(gè)部分將以具體實(shí)現所定義的方式來(lái)解讀,但是超過(guò)兩個(gè)開(kāi)始字符則將被視為單個(gè)字符。

在 3.6 版更改: 接受一個(gè) path-like object。

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

返回指定文件的規范路徑,消除路徑中存在的任何符號鏈接(如果操作系統支持)。

如果一個(gè)路徑不存在或是遇到了符號鏈接循環(huán),并且 strictTrue,則會(huì )引發(fā) OSError。 如果 strictFalse,則會(huì )盡可能地解析路徑并添加結果而不檢查路徑是否存在。

備注

這個(gè)函數會(huì )模擬操作系統生成規范路徑的過(guò)程,Windows 與 UNIX 的這個(gè)過(guò)程在處理鏈接和后續路徑組成部分的交互方式上有所差異。

操作系統 API 會(huì )根據需要來(lái)規范化路徑,因此通常不需要調用此函數。

在 3.6 版更改: 接受一個(gè) path-like object。

在 3.8 版更改: 在 Windows 上現在可以正確解析符號鏈接和交接點(diǎn) (junction point)。

在 3.10 版更改: 增加了 strict 形參。

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

返回從當前目錄或可選的 start 目錄至 path 的相對文件路徑。 這只是一個(gè)路徑計算:不會(huì )訪(fǎng)問(wèn)文件系統來(lái)確認 pathstart 是否存在或其性質(zhì)。 在 Windows 上,當 pathstart 位于不同驅動(dòng)器時(shí)將引發(fā) ValueError。

start 默認為 os.curdir。

可用性: Unix, Windows。

在 3.6 版更改: 接受一個(gè) path-like object。

os.path.samefile(path1, path2)?

如果兩個(gè)路徑都指向相同的文件或目錄,則返回 True。這由設備號和 inode 號確定,在任一路徑上調用 os.stat() 失敗則拋出異常。

可用性: Unix, Windows。

在 3.2 版更改: 添加了對 Windows 的支持。

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

在 3.6 版更改: 接受一個(gè) path-like object。

os.path.sameopenfile(fp1, fp2)?

如果文件描述符 fp1fp2 指向相同文件,則返回 True。

可用性: Unix, Windows。

在 3.2 版更改: 添加了對 Windows 的支持。

在 3.6 版更改: 接受一個(gè) path-like object。

os.path.samestat(stat1, stat2)?

如果 stat 元組 stat1stat2 指向相同文件,則返回 True。這些 stat 元組可能是由 os.fstat()、os.lstat()os.stat() 返回的。本函數實(shí)現了 samefile()sameopenfile() 底層所使用的比較過(guò)程。

可用性: Unix, Windows。

在 3.4 版更改: 添加了對 Windows 的支持。

在 3.6 版更改: 接受一個(gè) path-like object。

os.path.split(path)?

將路徑 path 拆分為一對,即 (head, tail),其中,tail 是路徑的最后一部分,而 head 里是除最后部分外的所有內容。tail 部分不會(huì )包含斜杠,如果 path 以斜杠結尾,則 tail 將為空。如果 path 中沒(méi)有斜杠,head 將為空。如果 path 為空,則 headtail 均為空。head 末尾的斜杠會(huì )被去掉,除非它是根目錄(即它僅包含一個(gè)或多個(gè)斜杠)。在所有情況下,join(head, tail) 指向的位置都與 path 相同(但字符串可能不同)。另請參見(jiàn)函數 dirname()basename()。

在 3.6 版更改: 接受一個(gè) path-like object。

os.path.splitdrive(path)?

將路徑 path 拆分為一對,即 (drive, tail),其中 drive 是掛載點(diǎn)或空字符串。在沒(méi)有驅動(dòng)器概念的系統上,drive 將始終為空字符串。在所有情況下,drive + tail 都與 path 相同。

在 Windows 上,本方法將路徑拆分為驅動(dòng)器/UNC 根節點(diǎn)和相對路徑。

如果路徑 path 包含盤(pán)符,則 drive 將包含冒號之前的所有內容包括冒號本身:

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

如果路徑 path 包含 UNC 路徑,則 drive 將包含主機名和 share,直至第四個(gè)分隔符但不包括該分隔符:

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

在 3.6 版更改: 接受一個(gè) path-like object。

os.path.splitext(path)?

將路徑名稱(chēng) path 拆分為 (root, ext) 對使得 root + ext == path,并且擴展名 ext 為空或以句點(diǎn)打頭并最多只包含一個(gè)句點(diǎn)。

如果路徑 path 不包含擴展名,則 ext 將為 '':

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

如果路徑 path 包含擴展名,則 ext 將被設為該擴展名,包括打頭的句點(diǎn)。 請注意在其之前的句點(diǎn)將被忽略:

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

Leading periods of the last component of the path are considered to be part of the root:

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

在 3.6 版更改: 接受一個(gè) path-like object。

os.path.supports_unicode_filenames?

如果(在文件系統限制下)允許將任意 Unicode 字符串用作文件名,則為 True。