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
。