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.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
,則將使用該環境變數的值,否則將使用HOMEPATH
和HOMEDRIVE
的組合。對於初始的~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.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 版本新增。
- os.path.islink(path)¶
如果 *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 版本更改: 接受 path 和 paths 的類路徑物件。
- os.path.normcase(path)¶
規範化路徑名的大小寫。在 Windows 上,將路徑名中的所有字元轉換為小寫,並將正斜槓轉換為反斜槓。在其他作業系統上,返回路徑不變。
在 3.6 版本中更改: 接受 類路徑物件。
- os.path.normpath(path)¶
透過摺疊冗餘分隔符和向上級引用來規範化路徑名,使
A//B
、A/B/
、A/./B
和A/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~1
到C:\\Program Files
。如果路徑不存在或遇到符號連結迴圈,並且 strict 為
True
,則會引發OSError
。如果 strict 為False
,則會忽略這些錯誤,因此結果可能會缺失或無法訪問。注意
此函式模擬作業系統用於生成規範路徑的過程,該過程在 Windows 和 UNIX 之間關於連結和後續路徑元件如何互動略有不同。
作業系統 API 會根據需要生成規範路徑,因此通常不需要呼叫此函式。
在 3.6 版本中更改: 接受 類路徑物件。
3.8 版本更改: 現在在 Windows 上解析符號連結和連線點。
3.10 版本更改: 添加了 strict 引數。
- os.path.relpath(path, start=os.curdir)¶
返回從當前目錄或可選的 start 目錄到 path 的相對檔案路徑。這是一個路徑計算:不會訪問檔案系統來確認 path 或 start 的存在或性質。在 Windows 上,當 path 和 start 在不同的驅動器上時,會引發
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)¶
如果檔案描述符 fp1 和 fp2 引用同一檔案,則返回
True
。3.2 版本更改: 添加了 Windows 支援。
在 3.6 版本中更改: 接受 類路徑物件。
- os.path.samestat(stat1, stat2)¶
如果 stat 元組 stat1 和 stat2 引用同一檔案,則返回
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 為空,則 head 和 tail 都為空。除非 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
。