os.path:平台独立的文件名管理
文章目录
- 一、解析路径
- 1、依赖变量:os.sep / os.extsep / os.pardir / os.curdir
- 2、os.path.split():(路径其余部分, 路径最后一部分)
- 3、os.path.basename():路径的最后一部分
- 4、os.path.dirname():路径的其余部分(去除最后一部分)
- 5、os.path.splitext():(路径其余部分, last扩展名分隔符+后面部分)
- 6、os.path.commonprefix():不考虑路径分隔符的公共前缀
- 7、os.path.commonpath():考虑路径分隔符的公共前缀
- 二、建立路径
- 1、os.path.join():合并多个路径组成部分
- 2、os.path.expanduser():将波浪线~字符转换为用户主目录名
- 3、os.path.expandvars():将 shell 环境变量替换为实际值
- 三、规范化路径
- 1、os.path.normpath():清除多余分隔符和 os.curdir,折叠 os.pardir + 上一级目录
- 2、os.path.abspath():把相对路径名转换为绝对路径名
- 四、获取文件属性
- 1、os.stat():获取文件或目录的元数据信息
- 2、os.path.getatime():获取文件的最后访问时间,Unix 时间戳
- 3、os.path.getmtime():获取文件的最后修改时间,Unix 时间戳
- 4、os.path.getctime():Linux > 最后元数据修改时间,Windows > 创建时间,Unix 时间戳
- 5、os.path.getsize():以字节为单位表示的文件大小
- 五、测试路径
- 1、os.path.isabs():是否为绝对路径
- 2、os.path.isfile():是否为一个普通文件(非目录、非符号链接等)
- 3、os.path.isdir():是否为一个目录
- 4、os.path.islink():是否为符号链接
- 5、os.path.ismount():是否为挂载点
- 6、os.path.exists():(文件 / 目录 / 有效符号链接)路径是否存在
- 7、os.path.lexists():(文件 / 目录 / 符号链接)路径是否存在
os.path
模块用于解析文件名,可以很方便地处理不同平台上的文件。
import os.path
一、解析路径
这部分介绍的函数用于将字符串解析成文件名的各个组成部分,不要求字符串所代表的路径真实存在。
1、依赖变量:os.sep / os.extsep / os.pardir / os.curdir
路径解析依赖于os
中定义的一些变量:
变量 | 解释 | 示例 |
---|---|---|
os.sep | 路径各部分之间的分隔符 | /、\ |
os.extsep | 文件名称与类型之间的分隔符,即扩展名分隔符 | . |
os.pardir | 路径中表示目录树上一级的部分 | . . |
os.curdir | 路径中指示当前目录的部分 | . |
2、os.path.split():(路径其余部分, 路径最后一部分)
os.path
模块中的split()
函数将字符串解析成「路径的其余部分」和「路径的最后一部分」,最后返回一个二元元组。
注意,字符串如果以「路径分隔符」结尾,元组的第二部分会是一个空字符串。
PATHS = ['/one/two/three','/one/two/three/','/','.','',
]for path in PATHS:print(os.path.split(path))>>> 输出结果:
('/one/two', 'three')
('/one/two/three', '')
('/', '')
('', '.')
('', '')
3、os.path.basename():路径的最后一部分
os.path
模块中的basename()
函数返回路径的最后一部分,等价于split()
返回值的第二部分。
同样,字符串如果以「路径分隔符」结尾,则会返回一个空字符串。
PATHS = ['/one/two/three','/one/two/three/','/','.','',
]for path in PATHS:print(os.path.basename(path))>>> 输出结果:
'three'
''
''
'.'
''
4、os.path.dirname():路径的其余部分(去除最后一部分)
os.path
模块中的dirname()
函数返回路径的前面部分,等价于split()
返回值的第一部分。
PATHS = ['/one/two/three','/one/two/three/','/','.','',
]for path in PATHS:print(os.path.dirname(path))>>> 输出结果:
'/one/two'
'/one/two/three'
'/'
''
''
5、os.path.splitext():(路径其余部分, last扩展名分隔符+后面部分)
os.path
模块中的splitext()
函数将字符串解析成「路径的其余部分」和「最后一个扩展名分隔符+后面部分」,最后返回一个二元元组。
注意:
- 扩展名分隔符前面必须有内容,才算是真正的扩展名分隔符,否则解析后会把它放在第一部分中
- 即使一个文件名包含多个扩展名,也只会解析最后一个扩展名分隔符
PATHS = ['filename.txt','filename','/path/to/filename.txt','/','','.','.test','my-archive.tar.gz','no-extension.',
]for path in PATHS:print(os.path.splitext(path))>>> 输出结果:
('filename', '.txt')
('filename', '')
('/path/to/filename', '.txt')
('/', '')
('', '')
('.', '')
('.test', '')
('my-archive.tar', '.gz')
('no-extension', '.')
6、os.path.commonprefix():不考虑路径分隔符的公共前缀
os.path
模块中的commonprefix()
函数接收一个路径列表作为参数。最后会返回一个字符串,表示所有路径中都出现的公共前缀。
注意,解析时不会考虑路径分隔符,所以解析得到的公共前缀不一定会落在分隔符边界上。
paths = ['/one/two/three/four','/one/two/threefold','/one/two/three/',]# /one/two/three
print(os.path.commonprefix(paths))
7、os.path.commonpath():考虑路径分隔符的公共前缀
os.path
模块中的commonpath()
函数则会考虑路径分隔符,该函数不会只返回路径值中的一部分。
paths = ['/one/two/three/four','/one/two/threefold','/one/two/three/',]# /one/two
print(os.path.commonpath(paths))
二、建立路径
1、os.path.join():合并多个路径组成部分
os.path
模块中的join()
函数可以将「多个路径组成部分」结合为一个值。
注意:
- 如果某个组成部分以路径分隔符开头,那么前面所有的组成部分都会被舍弃,该组成部分会成为新的开始部分。
- 应该向
join()
函数传入多个路径组成部分,而非一个元组或者列表,注意下面代码中的*号。
PATHS = [('one', 'two', 'three'),('/', 'one', 'two', 'three'),('/one', '/two', '/three'),
]for parts in PATHS:# 注意星号print(os.path.join(*parts))>>> 输出结果:
one/two/three
/one/two/three
/three
2、os.path.expanduser():将波浪线~字符转换为用户主目录名
os.path
模块中的expanduser()
函数可以将波浪线~
字符转换为用户主目录名。
注意:
- 如果用户的主目录无法找到,那么字符串将会直接原样返回,如下面的
~nosuchuser
- 在字符串前面添加路径分隔符,可以成功转换,但是不保证该路径真实存在,如下面的
~/Documents
for user in ['', 'mycomputer', '/Documents', 'nosuchuser']:lookup = '~' + userprint(os.path.expanduser(lookup))# >>> 输出结果:
/Users/mycomputer
/Users/mycomputer
~nosuchuser
/Users/mycomputer/Documents
3、os.path.expandvars():将 shell 环境变量替换为实际值
os.path
模块中的expandvars()
函数会将路径中出现的「所有 shell 环境变量」替换为「变量对应的实际值」,但是不保证该路径真实存在。
import osos.environ['MYVAR'] = 'VALUE'# /path/to/VALUE
print(os.path.expandvars('/path/to/$MYVAR'))
三、规范化路径
1、os.path.normpath():清除多余分隔符和 os.curdir,折叠 os.pardir + 上一级目录
os.path
模块中的normpath()
函数可以清除路径中「多余的路径分隔符」和「os.curdir
」,也会折叠os.pardir
及其上一级目录。
PATHS = ['one//two//three','one/./two/../three','zero/./one/../alt/two/three',
]for path in PATHS:print(os.path.normpath(path))>>> 输出结果:
one/two/three
one/three
zero/alt/two/three
2、os.path.abspath():把相对路径名转换为绝对路径名
os.path
模块中的abspath()
函数会把一个相对路径名转换为一个绝对路径名,返回一个从文件系统树最顶层开始的完整的路径。
import os# 用于改变当前 Python 程序的工作目录
os.chdir('/usr')PATHS = ['.','..','./one/two/three','../one/two/three',
]for path in PATHS:print(os.path.abspath(path))>>> 输出结果:
/usr
/
/usr/one/two/three
/one/two/three
四、获取文件属性
os.path
模块中存在一些用于获取文件属性的函数,类似于os.stat()
返回的结果。
1、os.stat():获取文件或目录的元数据信息
os
模块中的stat()
函数用于获取文件或目录的元数据信息。
import os
print(os.stat(__file__))>>> 输出结果:
os.stat_result(st_mode=33188, st_ino=36325802, st_dev=26777232, st_nlink=1, st_uid=501, st_gid=20, st_size=326, st_atime=1756800738, st_mtime=1756800738, st_ctime=1756800738)
返回的os.stat_result
对象包含以下关键属性:
属性名 | 含义 | 示例值 |
---|---|---|
st_mode | 文件类型和权限模式(整数) | 33188(普通文件,权限rw-r–r--) |
st_ino | 文件的索引节点编号 | 36325802 |
st_dev | 文件所在的设备标识符 | 26777232 |
st_nlink | 硬链接数量 | 1(默认) |
st_uid | 所有者用户 ID(Unix 系统) | 1000 |
st_gid | 所有者组 ID(Unix 系统) | 1000 |
st_size | 文件大小(字节),目录通常返回 0 或固定值 | 1024(1KB 文件) |
st_atime | 最后访问时间(Unix 时间戳,秒) | 1690000000.123 |
st_mtime | 最后修改时间(Unix 时间戳,秒) | 1690000100.456 |
st_ctime | Linux:最后元数据修改时间;Windows:创建时间 | 1690000200.789 |
对上表中的术语解释:
- 文件的索引节点编号:通过这个编号可以在文件系统中唯一地定位到一个文件或目录。
- 文件所在的设备标识符:设备标识符用于区分文件所在的物理或逻辑存储设备。
- 硬链接:类 Unix 操作系统中一种特殊的文件关联机制,本质是同一个文件的多个 “别名”——多个文件名指向存储介质中相同的数据块和索引节点,实现对同一文件内容的共享访问。
- Unix 时间戳:本质是一个整数(或浮点数),代表从 1970 年 1 月 1 日 00:00:00 UTC(世界协调时间) 开始,到目标时间点所经过的秒数。
2、os.path.getatime():获取文件的最后访问时间,Unix 时间戳
3、os.path.getmtime():获取文件的最后修改时间,Unix 时间戳
4、os.path.getctime():Linux > 最后元数据修改时间,Windows > 创建时间,Unix 时间戳
5、os.path.getsize():以字节为单位表示的文件大小
import time# time.ctime():将时间戳转换为可读的字符串格式
print('File :', __file__)
print('Access time :', time.ctime(os.path.getatime(__file__)))
print('Modified time:', time.ctime(os.path.getmtime(__file__)))
print('Change time :', time.ctime(os.path.getctime(__file__)))
print('Size :', os.path.getsize(__file__))>>> 输出结果:
File : /Users/mycomputer/test.py
Access time : Tue Sep 2 16:12:18 2025
Modified time: Tue Sep 2 16:12:18 2025
Change time : Tue Sep 2 16:12:18 2025
Size : 326
五、测试路径
os.path
模块提供了一些函数用于测试一个路径名是文件、目录还是符号链接(symlink),还可以检验该路径名是否真实存在。这些测试函数均会返回布尔值。
符号链接(symlink,全称 symbolic link,也常称为 “软链接”)是操作系统中一种特殊的文件类型,本质是一个 “指向另一个文件或目录的引用”,类似于 Windows 系统中的 “快捷方式”,但功能更底层、适用范围更广(可跨文件系统,且在命令行操作中表现更接近原文件)。
1、os.path.isabs():是否为绝对路径
2、os.path.isfile():是否为一个普通文件(非目录、非符号链接等)
3、os.path.isdir():是否为一个目录
4、os.path.islink():是否为符号链接
5、os.path.ismount():是否为挂载点
“挂载点”(Mount Point)是操作系统中用于连接外部存储设备(或虚拟存储资源)与文件系统目录树的 “桥梁”,本质是一个普通的目录,但被赋予了特殊功能:通过它可以访问原本不属于当前文件系统的存储资源(如 U 盘、硬盘分区、网络共享盘等)。
6、os.path.exists():(文件 / 目录 / 有效符号链接)路径是否存在
如果路径名是符号链接,则会跟踪链接指向的目标:
- 如果目标存在,返回
True
- 如果目标不存在(断链),返回
False
7、os.path.lexists():(文件 / 目录 / 符号链接)路径是否存在
如果路径名是符号链接,只判断「链接文件」本身是否存在,不去跟踪目标的有效性:
- 即使是断链(目标不存在),只要链接文件本身存在,就会返回
True
- 如果链接文件被删除,则返回
False
FILENAMES = [__file__,os.path.dirname(__file__),'/','./nosuchfile',
]for file in FILENAMES:print('File : {!r}'.format(file))print('Absolute :', os.path.isabs(file))print('Is File? :', os.path.isfile(file))print('Is Dir? :', os.path.isdir(file))print('Is Link? :', os.path.islink(file))print('Mountpoint? :', os.path.ismount(file))print('Exists? :', os.path.exists(file))print('Link Exists?:', os.path.lexists(file))print()>>> 输出结果:
File : '/Users/mycomputer/test.py'
Absolute : True
Is File? : True
Is Dir? : False
Is Link? : False
Mountpoint? : False
Exists? : True
Link Exists?: TrueFile : '/Users/mycomputer'
Absolute : True
Is File? : False
Is Dir? : True
Is Link? : False
Mountpoint? : False
Exists? : True
Link Exists?: TrueFile : '/'
Absolute : True
Is File? : False
Is Dir? : True
Is Link? : False
Mountpoint? : True
Exists? : True
Link Exists?: TrueFile : './nosuchfile'
Absolute : False
Is File? : False
Is Dir? : False
Is Link? : False
Mountpoint? : False
Exists? : False
Link Exists?: False