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)應(yīng)用程序需要類似shell的路徑擴展時,可以顯式調(diào)用諸如 expanduser()expandvars() 之類的函數(shù)。 (另請參見 glob 模塊。)

參見

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

備注

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

備注

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

  • posixpath 用于Unix 樣式的路徑

  • ntpath 用于 Windows 路徑

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

os.path.abspath(path)?

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

在 3.6 版更改: 接受一個 path-like object

os.path.basename(path)?

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

在 3.6 版更改: 接受一個 path-like object。

os.path.commonpath(paths)?

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

可用性: Unix, Windows。

3.5 新版功能.

在 3.6 版更改: 接受一個 類路徑對象 序列。

os.path.commonprefix(list)?

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

備注

此函數(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 版更改: 接受一個 path-like object。

os.path.dirname(path)?

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

在 3.6 版更改: 接受一個 path-like object

os.path.exists(path)?

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

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

在 3.6 版更改: 接受一個 path-like object。

os.path.lexists(path)?

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

在 3.6 版更改: 接受一個 path-like object。

os.path.expanduser(path)?

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

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

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

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

在 3.6 版更改: 接受一個 path-like object。

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

os.path.expandvars(path)?

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

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

在 3.6 版更改: 接受一個 path-like object。

os.path.getatime(path)?

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

os.path.getmtime(path)?

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

在 3.6 版更改: 接受一個 path-like object。

os.path.getctime(path)?

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

在 3.6 版更改: 接受一個 path-like object

os.path.getsize(path)?

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

在 3.6 版更改: 接受一個 path-like object

os.path.isabs(path)?

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

在 3.6 版更改: 接受一個 path-like object。

os.path.isfile(path)?

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

在 3.6 版更改: 接受一個 path-like object。

os.path.isdir(path)?

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

在 3.6 版更改: 接受一個 path-like object

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

在 3.6 版更改: 接受一個 path-like object。

os.path.ismount(path)?

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

3.4 新版功能: 支持在 Windows 上檢測非根掛載點。

在 3.6 版更改: 接受一個 path-like object。

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

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

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

在 3.6 版更改: 接受一個 類路徑對象 用于 pathpaths

os.path.normcase(path)?

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

在 3.6 版更改: 接受一個 path-like object。

os.path.normpath(path)?

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

備注

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

在 3.6 版更改: 接受一個 path-like object。

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

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

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

備注

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

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

在 3.6 版更改: 接受一個 path-like object。

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

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

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

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

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

可用性: Unix, Windows。

在 3.6 版更改: 接受一個 path-like object

os.path.samefile(path1, path2)?

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

可用性: Unix, Windows。

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

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

在 3.6 版更改: 接受一個 path-like object。

os.path.sameopenfile(fp1, fp2)?

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

可用性: Unix, Windows。

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

在 3.6 版更改: 接受一個 path-like object。

os.path.samestat(stat1, stat2)?

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

可用性: Unix, Windows。

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

在 3.6 版更改: 接受一個 path-like object。

os.path.split(path)?

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

在 3.6 版更改: 接受一個 path-like object。

os.path.splitdrive(path)?

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

在 Windows 上,本方法將路徑拆分為驅(qū)動器/UNC 根節(jié)點和相對路徑。

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

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

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

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

在 3.6 版更改: 接受一個 path-like object

os.path.splitext(path)?

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

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

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

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

>>>
>>> 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 版更改: 接受一個 path-like object

os.path.supports_unicode_filenames?

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