在 Python 中用 os.path 模块处理文件路径

os.path

os.path 模块常用于对路径的处理,下面是各个方法的介绍和举例

导入模块

1import os.path

获取绝对路径

1os.path.abspath('./')
2'/home/ubuntu'
3os.path.abspath('./test')
4'/home/ubuntu/test'

需要注意的是,abspath 方法不检测路径的有效性

比如,当前目录下不存在 hxhen 这个文件夹,但并不会由此引发异常

1os.path.abspath('./hxhen')
2'/home/ubuntu/hxhen'

更多的它只是把 当前所在路径 和 参数 进行拼接

获取共同路径

1os.path.commonpath(['/home/ubuntu/test''/home/ubuntu/Pictures'])
2'/home/ubuntu'
3os.path.commonpath(['../ubuntu/test''../ubuntu/Pictures'])
4'../ubuntu'

参数可以是 列表(list) 类型

需要注意的是,路径之间只能都为 相对路径 或者都为 绝对路径 ,不能相对路径和绝对路径混在一起,否则报错

来一个错误示范:

1os.path.commonpath(['/home/ubuntu/test''./Pictures'])
2Traceback (most recent call last):
3  File "<stdin>", line 1in <module>
4  File "/usr/lib/python3.6/posixpath.py", line 507in commonpath
5    raise ValueError("Can't mix absolute and relative paths"from None
6ValueError: Can't mix absolute and relative paths
7

此外,commonpath 方法同样是不保证路径的有效性的
如, hxhen 是一个不存在的文件夹

1os.path.commonpath(['/home/ubuntu/hxhen/test''/home/ubuntu/hxhen/Pictures'])
2'/home/ubuntu/hxhen'

判断路径是否存在

1os.path.exists('./test')
2True
3os.path.exists('./hxhen')
4False
5os.path.exists('/home/ubuntu/test')
6True
7os.path.exists('/home/ubuntu/hxhen')
8False

这个方法就见名知意了。可能要注意的是,在某些平台上会出现由于权限的关系导致路径存在却被判断为 False

替换路径中的 home 目录符号 ~

1 os.path.expanduser('~/test')
2'/home/ubuntu/test'

同样它不会检查路径的有效性

替换路径中的环境变量

1import os.path
2os.path.expandvars('$HOME/test')
3'/home/ubuntu/test'
4os.path.expandvars('$TEST')
5'/home/ubuntu/test'

这一方法不会检查路径是否有效

1os.path.expandvars('$TEST/hxhen')
2'/home/ubuntu/test/hxhen'  # 实际上 hxhen 这一文件夹并不存在

获取文件的访问时间,修改时间以及文件大小

1os.path.getatime('./test/pickle.pkl')  # get access time
21549807619.0545375
3os.path.getmtime('./test/pickle.pkl')  # get modification time
41549466184.002119
5os.path.getsize('./test/pickle.pkl')
654

对路径属性的几个判断

  • 判断是不是绝对路径
1os.path.isabs('./test')
2False
3os.path.isabs('/home/ubuntu/test')
4True
  • 判断是不是一个文件
1os.path.isfile('./test/pickle.pkl')
2True
3os.path.isfile('./test/test')
4False
5#同理,它可以用来判断文件是否存在
6os.path.isfile('./test/hxhen.txt')  #  hxhen.txt 这个文件不存在
7False
  • 判断是不是一个文件夹
1os.path.isdir('./test')
2True
3os.path.isdir('./test/test')
4True
5os.path.isdir('./test/pickle.pkl')
6False
  • 判断是不是挂载点
1os.path.ismount('/media/ubuntu/DT')
2True
3os.path.ismount('/home/ubuntu')
4False

分离文件和文件拓展

虽然 Linux 不强制文件拓展名,但为了便于人眼区分,这一习惯还是应用的比较广泛

1os.path.splitext('./test/pickle.pkl')
2('./test/pickle''.pkl')