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不執(zhí)行任何 自動(dòng) 路徑擴(kuò)展。當(dāng)應(yīng)用程序需要類似shell的路徑擴(kuò)展時(shí),可以顯式調(diào)用諸如 expanduser()expandvars() 之類的函數(shù)。 (另請(qǐng)參見 glob 模塊。)

參見

pathlib 模塊提供高級(jí)路徑對(duì)象。

備注

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

備注

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

  • posixpath 用于Unix 樣式的路徑

  • ntpath 用于 Windows 路徑

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

os.path.abspath(path)?

返回路徑 path 的絕對(duì)路徑(標(biāo)準(zhǔn)化的)。在大多數(shù)平臺(tái)上,這等同于用 normpath(join(os.getcwd(), path)) 的方式調(diào)用 normpath() 函數(shù)。

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

os.path.basename(path)?

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

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

os.path.commonpath(paths)?

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

可用性: Unix, Windows。

3.5 新版功能.

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

os.path.commonprefix(list)?

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

備注

此函數(shù)是逐字符比較,因此可能返回?zé)o效路徑。要獲取有效路徑,參見 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 的目錄名稱。這是將 path 傳入函數(shù) split() 之后,返回的一對(duì)值中的第一個(gè)元素。

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

os.path.exists(path)?

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

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

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

os.path.lexists(path)?

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

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

os.path.expanduser(path)?

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

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

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

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

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

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

os.path.expandvars(path)?

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

在 Windows 上,除了 $name${name} 外,還可以展開 %name%。

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

os.path.getatime(path)?

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

os.path.getmtime(path)?

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

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

os.path.getctime(path)?

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

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

os.path.getsize(path)?

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

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

os.path.isabs(path)?

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

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

os.path.isfile(path)?

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

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

os.path.isdir(path)?

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

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

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

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

os.path.ismount(path)?

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

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

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

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

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

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

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

os.path.normcase(path)?

規(guī)范路徑的大小寫。在 Windows 上,將路徑中的所有字符都轉(zhuǎn)換為小寫,并將正斜杠轉(zhuǎn)換為反斜杠。在其他操作系統(tǒng)上返回原路徑。

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

os.path.normpath(path)?

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

備注

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

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

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

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

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

備注

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

操作系統(tǒng) API 會(huì)根據(jù)需要來(lái)規(guī)范化路徑,因此通常不需要調(diào)用此函數(shù)。

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

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

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

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

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

start 默認(rèn)為 os.curdir

可用性: Unix, Windows。

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

os.path.samefile(path1, path2)?

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

可用性: Unix, Windows。

在 3.2 版更改: 添加了對(duì) Windows 的支持。

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

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

os.path.sameopenfile(fp1, fp2)?

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

可用性: Unix, Windows。

在 3.2 版更改: 添加了對(duì) Windows 的支持。

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

os.path.samestat(stat1, stat2)?

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

可用性: Unix, Windows。

在 3.4 版更改: 添加了對(duì) Windows 的支持。

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

os.path.split(path)?

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

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

os.path.splitdrive(path)?

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

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

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

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

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

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

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

os.path.splitext(path)?

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

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

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

如果路徑 path 包含擴(kuò)展名,則 ext 將被設(shè)為該擴(kuò)展名,包括打頭的句點(diǎn)。 請(qǐng)注意在其之前的句點(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?

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