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

os.path

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

导入模块

>>> import os.path

获取绝对路径

>>> os.path.abspath('./')
'/home/ubuntu'
>>> os.path.abspath('./test')
'/home/ubuntu/test'

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

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

>>> os.path.abspath('./hxhen')
'/home/ubuntu/hxhen'

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

获取共同路径

>>> os.path.commonpath(['/home/ubuntu/test', '/home/ubuntu/Pictures'])
'/home/ubuntu'
>>> os.path.commonpath(['../ubuntu/test', '../ubuntu/Pictures'])
'../ubuntu'

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

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

来一个错误示范:

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

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

>>> os.path.commonpath(['/home/ubuntu/hxhen/test', '/home/ubuntu/hxhen/Pictures'])
'/home/ubuntu/hxhen'

判断路径是否存在

>>> os.path.exists('./test')
True
>>> os.path.exists('./hxhen')
False
>>> os.path.exists('/home/ubuntu/test')
True
>>> os.path.exists('/home/ubuntu/hxhen')
False

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

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

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

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

替换路径中的环境变量

>>> import os.path
>>> os.path.expandvars('$HOME/test')
'/home/ubuntu/test'
>>> os.path.expandvars('$TEST')
'/home/ubuntu/test'

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

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

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

>>> os.path.getatime('./test/pickle.pkl')  # get access time
1549807619.0545375
>>> os.path.getmtime('./test/pickle.pkl')  # get modification time
1549466184.002119
>>> os.path.getsize('./test/pickle.pkl')
54

对路径属性的几个判断

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

分离文件和文件拓展

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

>>> os.path.splitext('./test/pickle.pkl')
('./test/pickle', '.pkl')

发表评论

电子邮件地址不会被公开。 必填项已用*标注