os.path — 常见的路径名操作 — Python 文档
os.path — 常见的路径名操作
源代码: :source:`Lib/posixpath.py` (for POSIX) and :source:`Lib/ntpath.py` (for Windows NT).
该模块在路径名上实现了一些有用的功能。 要读取或写入文件,请参阅 open(),而要访问文件系统,请参阅 os 模块。 路径参数可以作为字符串或字节传递。 鼓励应用程序将文件名表示为 (Unicode) 字符串。 不幸的是,某些文件名在 Unix 上可能无法表示为字符串,因此需要在 Unix 上支持任意文件名的应用程序应该使用字节对象来表示路径名。 反之亦然,使用字节对象不能代表 Windows 上的所有文件名(在标准 mbcs
编码中),因此 Windows 应用程序应该使用字符串对象来访问所有文件。
与 unix shell 不同,Python 不进行任何 自动 路径扩展。 当应用程序需要类似 shell 的路径扩展时,可以显式调用诸如 expanduser() 和 expandvars() 之类的函数。 (另请参阅 glob 模块。)
笔记
所有这些函数都只接受字节或只接受字符串对象作为它们的参数。 如果返回路径或文件名,则结果是相同类型的对象。
笔记
由于不同的操作系统有不同的路径名约定,因此标准库中有该模块的多个版本。 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 传递给函数 split() 返回的对的第二个元素。 注意这个函数的结果和Unix的basename程序不同; 其中,
'/foo/bar/'
的 basename 返回'bar'
,basename() 函数返回一个空字符串 ()。
3.6 版更改: 接受 类路径对象 。
- os.path.commonpath(paths)
返回序列 paths 中每个路径名的最长公共子路径。 如果 paths 包含绝对和相对路径名,paths 位于不同的驱动器上,或者 paths 为空,则引发 ValueError。 与 commonprefix() 不同,它返回一个有效路径。
3.5 版中的新功能。
3.6 版更改: 接受一系列 类路径对象 。
- os.path.commonprefix(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() 的权限,即使 路径 物理存在,此函数也可能返回False
。在 3.3 版更改: path 现在可以是整数:如果是打开的文件描述符,则返回
True
,否则返回False
。3.6 版更改: 接受 类路径对象 。
- os.path.lexists(path)
如果 path 引用现有路径,则返回
True
。 对于损坏的符号链接,返回True
。 在缺少 os.lstat() 的平台上相当于 exists()。3.6 版更改: 接受 类路径对象 。
- os.path.expanduser(path)
在 Unix 和 Windows 上,返回带有
~
或~user
的初始组件替换为 用户 的主目录的参数。在 Unix 上,初始的
~
被设置为环境变量HOME
替换; 否则通过内置模块pwd在password目录中查找当前用户的家目录。 直接在密码目录中查找初始的~user
。在 Windows 上,如果设置了
USERPROFILE
,否则将使用HOMEPATH
和HOMEDRIVE
的组合将会被使用。 初始的~user
是通过从上面派生的创建的用户路径中剥离最后一个目录组件来处理的。如果扩展失败或路径不以波浪号开头,则返回路径不变。
3.6 版更改: 接受 类路径对象 。
3.8 版更改: 在 Windows 上不再使用
HOME
。
- os.path.expandvars(path)
返回扩展了环境变量的参数。
$name
或${name}
形式的子串被环境变量 name 的值替换。 格式错误的变量名和对不存在变量的引用保持不变。在 Windows 上,除了
$name
和${name}
之外,还支持%name%
扩展。3.6 版更改: 接受 类路径对象 。
- os.path.getmtime(path)
返回最后修改path的时间。 返回值是一个浮点数,给出自纪元以来的秒数(参见 time 模块)。 如果文件不存在或无法访问,则引发 OSError。
3.6 版更改: 接受 类路径对象 。
- os.path.getctime(path)
返回系统的 ctime,在某些系统(如 Unix)上是最后一次元数据更改的时间,而在其他系统(如 Windows)上是 path 的创建时间。 返回值是一个数字,给出自纪元以来的秒数(参见 time 模块)。 如果文件不存在或无法访问,则引发 OSError。
3.6 版更改: 接受 类路径对象 。
- os.path.isabs(path)
如果 path 是绝对路径名,则返回
True
。 在 Unix 上,这意味着它以斜杠开头,在 Windows 上,它在切掉一个潜在的驱动器号后以(反)斜杠开头。3.6 版更改: 接受 类路径对象 。
- os.path.isfile(path)
如果 path 是 existing 常规文件,则返回
True
。 这遵循符号链接,因此 islink() 和 isfile() 对于同一路径都可以为真。3.6 版更改: 接受 类路径对象 。
- os.path.isdir(path)
如果 path 是 existing 目录,则返回
True
。 这遵循符号链接,因此 islink() 和 isdir() 对于同一路径都可以为真。3.6 版更改: 接受 类路径对象 。
- os.path.islink(path)
如果 path 引用作为符号链接的 existing 目录条目,则返回
True
。 如果 Python 运行时不支持符号链接,则始终为False
。3.6 版更改: 接受 类路径对象 。
- os.path.ismount(path)
如果路径名 path 是 挂载点 :文件系统中已挂载不同文件系统的点,则返回
True
。 在 POSIX 上,该函数检查 path 的父节点path/..
是否在与 path 不同的设备上,或者path/..
和 ]path 指向同一设备上的同一个 i-node——这应该检测所有 Unix 和 POSIX 变体的挂载点。 它无法可靠地检测同一文件系统上的绑定安装。 在 Windows 上,驱动器号根和共享 UNC 始终是挂载点,对于任何其他路径,调用GetVolumePathName
以查看它是否与输入路径不同。3.4 新功能: 支持检测 Windows 上的非 root 挂载点。
3.6 版更改: 接受 类路径对象 。
- os.path.join(path, *paths)
智能地连接一个或多个路径组件。 返回值是 path 和 *paths 的任何成员的串联,每个非空部分后面只有一个目录分隔符,除了最后一个,这意味着结果只会以如果最后一部分为空,则为分隔符。 如果一个组件是绝对路径,则所有之前的组件都将被丢弃,并从绝对路径组件继续连接。
在 Windows 上,遇到绝对路径组件(例如,
r'\foo'
)时不会重置驱动器号。 如果一个组件包含驱动器号,则所有以前的组件都将被丢弃并重置驱动器号。 请注意,由于每个驱动器都有一个当前目录,因此os.path.join("c:", "foo")
表示相对于驱动器C:
(c:foo
) 上的当前目录的路径,而不是c:\foo
.在 3.6 版中更改: 接受 path 和 paths 的 path-like object。
- os.path.normcase(path)
规范化路径名的大小写。 在 Windows 上,将路径名中的所有字符转换为小写,并将正斜杠转换为反斜杠。 在其他操作系统上,返回路径不变。
3.6 版更改: 接受 类路径对象 。
- os.path.normpath(path)
通过折叠冗余分隔符和上级引用来规范路径名,以便
A//B
、A/B/
、A/./B
和A/foo/../B
都变成A/B
。 此字符串操作可能会更改包含符号链接的路径的含义。 在 Windows 上,它将正斜杠转换为反斜杠。 要规范化大小写,请使用 normcase()。3.6 版更改: 接受 类路径对象 。
- os.path.realpath(path)
返回指定文件名的规范路径,消除路径中遇到的任何符号链接(如果操作系统支持它们)。
笔记
当符号链接循环发生时,返回的路径将是循环的一个成员,但不保证将是哪个成员。
3.6 版更改: 接受 类路径对象 。
3.8 版更改:符号链接和交叉点现在在 Windows 上得到解决。
- 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
。 这由设备号和索引节点号决定,如果对任一路径名的 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)
如果统计元组 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 中剥离,除非它是根(只有一个或多个斜杠)。 在所有情况下,join(head, tail)
返回与 path 相同位置的路径(但字符串可能不同)。 另请参阅函数 dirname() 和 basename()。3.6 版更改: 接受 类路径对象 。
- 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 版更改: 接受 类路径对象 。
- os.path.splitext(path)
将路径名 path 拆分为一对
(root, ext)
,使得root + ext == path
和 ext 为空或以句点开头且最多包含一个句点。 基本名称上的前导句点将被忽略;splitext('.cshrc')
返回('.cshrc', )
。3.6 版更改: 接受 类路径对象 。
- os.path.supports_unicode_filenames
True
如果任意 Unicode 字符串可以用作文件名(在文件系统施加的限制内)。