Python os.path标准库 --常用路径操作

os.path 模块用于常用路径操作,本篇文章以 windows 系统作为示例

os.path模块方法

路径返回

返回绝对路径

abspath(path)

1
2
3
from os import path

print(path.abspath('雨园'))
1
x:\xx\xx\雨园

返回基本名称

basename(path)

  • 这是将 path 传入函数 split() 之后,返回的一对值中的第二个元素
1
2
3
4
from os import path

print(path.basename('a/b'))
print(path.basename('a/b/')) # 以斜杠结尾时返回空
1
2
b

返回最长公共子路径

commonpath(paths)

  • 如果 paths 同时包含绝对路径和相对路径,或 paths 在不同的驱动器上,或 paths 为空,则抛出 ValueError 异常
1
2
3
from os import path

print(path.commonpath(['a/b/c', 'a/b/cc']))
1
a\b

返回最长公共前缀

commonprefix(list)

  • 如果 list 为空,则返回空字符串
  • 此函数是逐字符比较,因此可能返回无效路径。要获取有效路径,使用 commonpath()
1
2
3
4
from os import path

print(path.commonprefix([]))
print(path.commonprefix(['/usr/lib', '/usr/local/lib']))
1
2

/usr/l

返回目录名称

dirname(path)

  • 返回路径 path 的目录名称
  • 这是将 path 传入函数 split() 之后,返回的一对值中的第一个元素
1
2
3
4
5
6
7
from os import path

print(path.dirname(''))
print(path.dirname('a')) # 如果没有斜杠就返回空
print(path.dirname('/a')) # 根目录
print(path.dirname('a/b'))
print(path.dirname('a/b/')) # 以斜杠结尾
1
2
3
4
5


/
a
a/b

返回指定文件路径

realpath(path)

  • 返回指定文件的规范路径,消除路径中存在的任何符号链接(如果操作系统支持)
1
2
3
from os import path

print(path.realpath(r'./b\c\\d/./e.txt'))
1
x:\xx\xx\b\c\d\e.txt

返回相对文件路径

relpath(path, start=os.curdir)

  • 返回从当前目录或可选的 start 目录至 path 的相对文件路径

路径替换

替换为家目录

expanduser(path)

  • 将 path 中开头部分的 ~~user 替换为当前用户的家目录并返回
  • 如果展开路径失败,或者路径不是以波浪号开头,则路径将保持不变
1
2
3
4
from os import path

print(path.expanduser('~\\a'))
print(path.expanduser('~yu\\a'))
1
2
C:\Users\yu\a
C:\Users\yu\a

替换为环境变量的值

expandvars(path)

  • 输入带有环境变量的路径作为参数,返回展开变量以后的路径
  • $name ${name} 形式的子字符串被环境变量 name 的值替换,windows还可以展开 %name%
  • 格式错误的变量名称和对不存在变量的引用保持不变
1
2
3
4
5
from os import path

print(path.expandvars('$USERNAME'))
print(path.expandvars('${USERNAME}'))
print(path.expandvars('%USERNAME%')) # 在windows系统上展开
1
2
3
yu
yu
yu

路径信息

最后访问时间

getatime(path)

  • 返回值是一个浮点数,为纪元秒数
1
2
3
from os import path

print(path.getatime('./yu.txt'))
1
1620739577.8033438

最后修改时间

getmtime(path)

  • 返回值是一个浮点数,为纪元秒数
1
2
3
from os import path

print(path.getmtime('./yu.txt'))
1
1620739576.8120322

最近创建时间

getctime(path)

  • 返回值是一个浮点数,为纪元秒数
  • 在Windows上,它是 path 的创建时间
1
2
3
from os import path

print(path.getctime('./yu.txt'))
1
1620739535.987736

文件大小

getsize(path)

  • 返回 path 的大小,以字节为单位
1
2
3
from os import path

print(path.getsize('./yu.txt'))
1
3

路径判断

是否绝对路径

isabs(path)

  • 如果 path 是一个绝对路径,则返回 True
  • 在 Unix 上,它就是以斜杠开头,而在 Windows 上,它可以是去掉驱动器号后以斜杠(或反斜杠)开头。
1
2
3
4
5
6
from os import path

print(path.isabs('/a'))
print(path.isabs(r'\a'))
print(path.isabs('\\a'))
print(path.isabs('a/'))
1
2
3
4
True
True
True
False

是否文件

isfile(path)

  • 如果 path 中的文件存在,则返回 True
  • 本方法会跟踪符号链接,因此,对于同一路径,islink()isfile() 都可能为 True
1
2
3
4
from os import path

print(path.isfile('./a.txt'))
print(path.isfile('./b.txt'))
1
2
True
False

是否目录

isdir(path)

  • 如果 path 中的目录存在,则返回 True
  • 本方法会跟踪符号链接,因此,对于同一路径,islink()isdir() 都可能为 True
1
2
3
4
from os import path

print(path.isdir('./a'))
print(path.isdir('./b'))
1
2
True
False

是否符号链接

islink(path)

  • 如果 path 指向的存在目录条目是一个符号链接,则返回 True
  • 如果 Python 运行时不支持符号链接,则总是返回 False

是否挂载点

ismount(path)

  • 如果路径 path 是 挂载点 (文件系统中挂载其他文件系统的点),则返回 True

是否指向相同文件或目录

samefile(path1, path2)

  • 如果两个路径都指向相同的文件或目录,则返回 True

文件描述符是否指向相同文件

sameopenfile(fp1, fp2)

  • 如果文件描述符 fp1 和 fp2 指向相同文件,则返回 True

状态元组是否指向相同文件

samestat(stat1, stat2)

  • 如果 stat 元组 stat1 和 stat2 指向相同文件,则返回 True
  • stat 元组可能是由 os.fstat()os.lstat()os.stat() 返回的

路径是否存在

exists(path)

  • 如果 path 指向一个已存在的路径或已打开的文件描述符,返回 True
  • 对于失效的符号链接(路径不存在),返回 False
1
2
3
4
from os import path

print(path.exists('./b')) # 本地存在的路径
print(path.exists('a/b')) # 这个路径并不存在
1
2
True
False

lexists(path)

  • 如果 path 指向一个已存在的路径,返回 True
  • 对于失效的符号链接(路径损坏),也返回 True
1
2
3
4
from os import path

print(path.lexists('./b')) # 本地存在的路径
print(path.lexists('a/b')) # 这个路径并不存在
1
2
True
False

路径拼接

join(path, *paths)

  • 返回拼接后的路径
1
2
3
from os import path

print(path.normcase(r'.\B'))
1
.\b

路径规范

规范路径的大小写

normcase(path)

  • 在 Windows 上,将路径中的所有字符都转换为小写,并将正斜杠转换为反斜杠。在其他操作系统上返回原路径
1
2
3
from os import path

print(path.normcase(r'.\B'))
1
.\b

标准化路径名

normpath(path)

  • 在 Windows 上,本方法将正斜杠转换为反斜杠
1
2
3
from os import path

print(path.normpath(r'./b\c\\d/./e'))
1
b\c\d\e

路径拆分

拆分为 (head, tail)

split(path)

  • 将路径 path 拆分为两元组 (head, tail),其中,tail 是路径的最后一部分,而 head 是除最后部分外的所有内容
  • 如果 path 以斜杠结尾,则 tail 将为空
  • 如果 path 中没有斜杠,head 将为空
  • 如果 path 为空,则 head 和 tail 均为空
  • head 末尾的斜杠会被去掉,除非它是根目录(即它仅包含一个或多个斜杠)
1
2
3
4
5
6
7
from os import path

print(path.split('')) # 为空
print(path.split('a')) # 没有斜杠,head为空
print(path.split('/a')) # 根目录
print(path.split('a/b')) # 不以斜杠结尾
print(path.split('a/b/')) # 以斜杠结尾,tail为空
1
2
3
4
5
('', '')
('', 'a')
('/', 'a')
('a', 'b')
('a/b', '')

拆分为 (drive, tail)

splitdrive(path)

  • 将路径 path 拆分为两元组 (drive, tail),其中 drive 是挂载点或空字符串
  • 在没有驱动器概念的系统上,drive 将始终为空字符串
  • 在所有情况下,drive + tail 都与 path 相同
  • 在 Windows 上,本方法将路径拆分为驱动器/UNC 根节点和相对路径
1
2
3
from os import path

print(path.splitdrive(r'C:\a\b'))
1
('C:', '\\a\\b')

拆分为 (root, ext)

splitext(path)

  • 将路径 path 拆分为两元组 (root, ext),使 root + ext == path
  • 其中 ext 为空或以英文句点开头,且最多包含一个句点
  • 路径前的句点将被忽略
1
2
3
4
5
from os import path

print(path.splitext('/a')) # 开头为空
print(path.splitext('.a')) # 路径前的句点将被忽略
print(path.splitext('./a')) # 开头为英文句点
1
2
3
('/a', '')
('.a', '')
('./a', '')

将 Unicode 字符串用作文件名

supports_unicode_filenames

  • 如果(在文件系统限制下)允许将任意 Unicode 字符串用作文件名,则为 True

参考资料