Skip to main content

11.2. os.path —公共路径名操作

源代码: Lib/posixpath.py (用于POSIX),Lib/ntpath.py (用于Windows NT)和 Lib/macpath.py (用于Macintosh)


这个模块对路径名实现一些有用的功能。要读取或写入文件,请参阅 open(),以及访问文件系统,请参阅 os 模块。路径参数可以作为字符串或字节传递。鼓励应用程序将文件名表示为(Unicode)字符串。不幸的是,一些文件名在Unix上可能不能表示为字符串,因此需要在Unix上支持任意文件名的应用程序应该使用bytes对象来表示路径名。反之亦然,使用字节对象不能表示Windows上的所有文件名(在标准 mbcs 编码),因此Windows应用程序应该使用字符串对象来访问所有文件。

与unix shell不同,Python不做任何 automatic 路径扩展。当应用程序需要shell样路径扩展时,可以显式调用 expanduser()expandvars() 等函数。 (参见 glob 模块。)

参见

pathlib 模块提供高级路径对象。

注解

所有这些函数只接受字节或只接受字符串对象作为它们的参数。如果返回路径或文件名,结果是相同类型的对象。

注解

由于不同的操作系统具有不同的路径名约定,因此在标准库中有此模块的多个版本。 os.path 模块始终是适合Python正在运行的操作系统的路径模块,因此可用于本地路径。但是,如果要以不同格式之一处理 always 路径,则还可以导入和使用各个模块。它们都有相同的接口:

  • posixpath 用于UNIX样式路径

  • ntpath for Windows路径

  • macpath 用于旧式MacOS路径

os.path.abspath(path)

返回路径名 path 的规范化绝对版本。在大多数平台上,这相当于调用函数 normpath(),如下所示:normpath(join(os.getcwd(), path))

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

os.path.basename(path)

返回路径名 path 的基本名称。这是通过将 path 传递给函数 split() 返回的对的第二个元素。注意,此函数的结果与Unix basename 程序不同;其中 '/foo/bar/'basename 返回 'bar',则 basename() 函数返回空字符串('')。

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

os.path.commonpath(paths)

返回序列 paths 中每个路径名的最长公共子路径。如果 paths 包含绝对路径名和相对路径名,或者如果 paths 为空,则提高ValueError。与 commonprefix() 不同,这会返回有效的路径。

可用性:Unix,Windows

3.5 新版功能.

在 3.6 版更改: 接受 路径样对象 的序列。

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

os.path.dirname(path)

返回路径名 path 的目录名。这是通过将 path 传递给函数 split() 返回的对的第一个元素。

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

os.path.exists(path)

如果 path 引用现有路径或打开的文件描述符,则返回 True。返回破坏的符号链接的 False。在某些平台上,如果未授予对所请求文件执行 os.stat() 的权限,即使 path 物理上存在,此函数也可能返回 False

在 3.3 版更改: path 现在可以是一个整数:如果它是一个打开的文件描述符,则返回 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上,返回参数,~~user 的初始组件由 user 的主目录替换。

在Unix上,如果设置了环境变量 HOME,则初始 ~ 被替换;否则通过内置模块 pwd 在密码目录中查找当前用户的主目录。在密码目录中直接查找初始 ~user

在Windows上,如果设置,将使用 HOMEUSERPROFILE,否则将使用 HOMEPATHHOMEDRIVE 的组合。通过从上面得到的创建的用户路径剥离最后一个目录组件来处理初始 ~user

如果扩展失败或路径不以波形符号开头,则路径将不更改地返回。

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

os.path.expandvars(path)

返回带有扩展的环境变量的参数。 $name${name} 形式的子字符串由环境变量 name 的值替换。格式不正确的变量名称和对不存在的变量的引用保持不变。

在Windows上,除了 $name${name} 之外,还支持 %name% 扩展。

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

os.path.getatime(path)

返回 path 最后一次访问的时间。返回值是一个数字,给出了自纪元以来的秒数(参见 time 模块)。如果文件不存在或无法访问,请提高 OSError

如果 os.stat_float_times() 返回 True,则结果为浮点数。

os.path.getmtime(path)

返回上次修改 path 的时间。返回值是一个数字,给出了自纪元以来的秒数(参见 time 模块)。如果文件不存在或无法访问,请提高 OSError

如果 os.stat_float_times() 返回 True,则结果为浮点数。

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

os.path.getctime(path)

返回系统的ctime,在某些系统(如Unix)上是最后元数据更改的时间,在其他系统(如Windows)上,是 path 的创建时间。返回值是一个数字,给出了自纪元以来的秒数(参见 time 模块)。如果文件不存在或无法访问,请提高 OSError

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

os.path.getsize(path)

返回 path 的大小(以字节为单位)。如果文件不存在或无法访问,请提高 OSError

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

os.path.isabs(path)

如果 path 是绝对路径名,则返回 True。在Unix上,这意味着它以斜杠开头,在Windows上,它在切断潜在驱动器号之后以(后)斜杠开始。

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

os.path.isfile(path)

如果 path 是现有的常规文件,则返回 True。这遵循符号链接,因此 islink()isfile() 对于相同的路径可以是真的。

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

os.path.isdir(path)

如果 path 是现有目录,则返回 True。这遵循符号链接,因此 islink()isdir() 对于相同的路径可以是真的。

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

如果 path 引用了作为符号链接的目录项,则返回 True。如果Python运行时不支持符号链接,则始终为 False

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

os.path.ismount(path)

如果路径名 pathmount point,则返回 True:文件系统中已装入其他文件系统的点。在POSIX上,该函数检查 path 的父代,path/.. 是否在与 path 不同的设备上,或者 path/..path 是否指向同一设备上的同一i节点 - 这应该检测所有Unix和POSIX变体的安装点。在Windows上,驱动器盘符根和共享UNC总是安装点,对于任何其他路径,调用 GetVolumePathName 以查看它是否与输入路径不同。

3.4 新版功能: 支持在Windows上检测非根安装点。

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

os.path.join(path, *paths)

智能加入一个或多个路径组件。返回值是 path*paths 的任何成员的并置,每个非空部分除了最后一个之外,只有一个目录分隔符(os.sep),这意味着如果最后一个部分为空,结果将只在分隔符中结束。如果组件是绝对路径,则所有先前组件都将被丢弃,并且从绝对路径组件继续加入。

在Windows上,当遇到绝对路径组件(例如,r'\foo')时,不会重置驱动器盘符。如果组件包含驱动器号,则所有以前的组件都将被丢弃,并且驱动器号被重置。请注意,由于每个驱动器都有一个当前目录,os.path.join("c:", "foo") 表示相对于驱动器 C:c:foo)上的当前目录的路径,而不是 c:\foo

在 3.6 版更改: 接受 pathpathspath-like object

os.path.normcase(path)

规范化路径名的大小写。在Unix和Mac OS X上,这会返回路径不变;在不区分大小写的文件系统上,它将路径转换为小写。在Windows上,它还将正斜杠转换为反斜线。如果 path 的类型不是 strbytes (直接或间接通过 os.PathLike 接口),请提高TypeError。

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

os.path.normpath(path)

通过折叠冗余分隔符和上级引用来标准化路径名,以便 A//BA/B/A/./BA/foo/../B 都变为 A/B。此字符串操作可能更改包含符号链接的路径的含义。在Windows上,它将正斜杠转换为反斜线。要使情况标准化,请使用 normcase()

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

os.path.realpath(path)

返回指定文件名的规范路径,消除路径中遇到的任何符号链接(如果它们受操作系统支持)。

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

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

从当前目录或从可选的 start 目录中返回相对文件路径到 path。这是一个路径计算:文件系统不被访问以确认 pathstart 的存在或性质。

start 默认为 os.curdir

可用性:Unix,Windows。

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

os.path.samefile(path1, path2)

如果两个路径名参数指向相同的文件或目录,则返回 True。这由设备号和i节点号决定,如果对任一路径名的 os.stat() 调用失败,则引发异常。

可用性:Unix,Windows。

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

在 3.4 版更改: Windows现在使用与所有其他平台相同的实现。

在 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。这些结构可能已由 os.fstat()os.lstat()os.stat() 返回。此函数实现 samefile()sameopenfile() 使用的基本比较。

可用性:Unix,Windows。

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

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

os.path.split(path)

将路径名 path 拆分为一对,(head, tail),其中 tail 是最后一个路径名组件,head 是导致该路径名的所有内容。 tail 部分不会包含斜杠;如果 path 以斜杠结尾,则 tail 将为空。如果 path 中没有斜线,head 将为空。如果 path 为空,则 headtail 都为空。尾部斜线从 head 中除去,除非它是根(仅一个或多个斜线)。在所有情况下,join(head, tail) 返回与 path 相同位置的路径(但字符串可能不同)。另请参见函数 dirname()basename()

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

os.path.splitdrive(path)

将路径名 path 拆分为一对 (drive, tail),其中 drive 是装载点或空字符串。在不使用驱动器规格的系统上,drive 将始终为空字符串。在所有情况下,drive + tail 将与 path 相同。

在Windows上,将路径名分为驱动器/UNC共享点和相对路径。

如果路径包含驱动器盘符,驱动器将包含直到并包括冒号的所有内容。例如 splitdrive("c:/dir") 返回 ("c:", "/dir")

如果路径包含UNC路径,则驱动器将包含主机名和共享,但最多但不包括第四个分隔符。例如 splitdrive("//host/computer/dir") 返回 ("//host/computer", "/dir")

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

os.path.splitext(path)

将路径名 path 拆分为一对 (root, ext),以使 root + ext == pathext 为空或以句点开头,并且最多包含一个句点。忽略基本名称上的前导周期; splitext('.cshrc') 返回 ('.cshrc', '')

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

os.path.splitunc(path)

3.1 版后已移除: 请改用 splitdrive

将路径名 path 拆分为一对 (unc, rest),以便 unc 是UNC装入点(如 r'\\host\mount')(如果存在)和 rest 路径的其余部分(如 r'\path\file.ext')。对于包含驱动器号的路径,unc 将始终为空字符串。

可用性:Windows。

os.path.supports_unicode_filenames

True,如果任意Unicode字符串可以用作文件名(在文件系统限制的限制之内)。