Python的os模块(operating system)是提供给用户来与操作系统进行交互的内置库,可以用来进行文件和目录的管理操作。它提供了一系列函数,允许你创建、删除、重命名、遍历以及获取文件和目录的信息。本文我将为大家介绍这个内置库在路径管理中的所有操作。
路径管理 os.path
当我们使用os进行路径管理时,需要用到os.path这个类下的一些方法,这些方法在使用时都只需要传入一个path参数即可。他们的具体使用方法如下文所示。
1.相对路径转绝对路径
使用os.path.abspath()即可实现将相对路径转换为绝对路径
import os
os.path.abspath('情况表.xlsx')
结果:
2.获取路径中的最后一部分内容
使用os.path.basename函数可以获取路径中的最后一部分内容,如果该路径指向的是一个文件,那么返回结果便是文件名,如果该路径指向一个目录,那么返回结果为目录名。
import os
os.path.basename(r'e:\\OneDrive\\Desktop\\帮忙\\毕业设计.docx')
结果:
这里需要注意的是,对于basename函数,只要传入的字符串是pathLike(带有\:等标识符)的,返回结果便是最后一部分,无论这个路径是否有效
3.找到多个字符串路径的最长公共路径(有效真实的路径)
使用os.path.commompath()函数即可实现上述功能,一般而言,我们可以用它来查找文件的根目录。
import os
paths=[
'/帮忙/毕业设计.docx',
'/帮忙/情况表.xlsx',
]
print(os.path.commonpath(paths))
结果:
这里需要注意的是commonpath函数传入的路径列表内的所有路径必须存在公共路径,也就是具有相同根目录,否则会报错。
4.找出多个字符串路径的最长公共前缀
使用os.path.commonprefix()可以实现该功能,不过需要注意的是该函数接受的参数是任意字符串,返回值也是字符串,因此使用该函数并不能一定获取到一个路径。
import os
paths=[
'Goodnight',
'Goodmorning',
'Goodafternoon'
]
print(os.path.commonprefix(paths))
结果:
5.判断路径是否真实存在
os.path.exists()是我们在进行路径处理时使用频率最高的一个函数,主要用来判断给定路径是否真实有效,返回值为True or False.
import os
print(os.path.exists(r'E:\OneDrive\Desktop\帮忙\毕业设计.docx'))
print(os.path.exists(r'E:\OneDrive\Desktop\帮忙\毕业设计'))
结果:
6.处理与用户主目录相关的路径扩展
os.expanduser()函数可以实现上述操作,当我们开发跨平台应用需要在用户主目录下配置文件时即可使用该函数。
import os
print(os.path.expanduser('~'))#输出:'/home/username'(Linux)或'C:\\Users\\username(Windows)
print(os.path.expanduser('~/Documents'))#输出:'/home/username/Documents'或'C:\\Users\\username\\Documents'
结果:
7.扩展路径中的环境变量
环境变量(Environment Variables)是操作系统中用来存储系统配置信息和用户设置的键值对(key-value pairs),可以被操作系统和应用程序访问使用。在windows系统中,可以运行:
"SystemPropertiesAdvanced.exe"打开系统属性面板后,点击环境变量来手动管理。
使用os.path.expandvars()可以将包含环境变量引用(如 $VAR
或 ${VAR}
格式)的路径字符串转换为包含实际变量值的完整路径。
import os
var=os.path.expandvars(r"%wechatpath%")
print(var)
结果:
7.获取给定路径下的文件创建时间
使用os.getctime()可以获取给定路径下的文件的创建时间,返回结果为从纪元(1970-01-01 00:00:00 UTC)到创建时间的秒数(浮点数)
import os
import time
print(os.path.getctime(r'E:\OneDrive\Desktop\帮忙\毕业设计.docx'))
print(time.ctime(os.path.getctime(r'E:\OneDrive\Desktop\帮忙\毕业设计.docx')))
特别地,如果我们想将返回值转换为可读的时间戳,可以使用time模块下的ctime
结果:
8.获取给定路径下的文件最后访问时间
使用os.getatime()可以获取给定路径下的文件的创建时间,返回结果为从纪元(1970-01-01 00:00:00 UTC)到创建时间的秒数(浮点数)
import os
import time
print(os.path.getatime(r'E:\OneDrive\Desktop\帮忙\毕业设计.docx'))
print(time.ctime(os.path.getatime(r'E:\OneDrive\Desktop\帮忙\毕业设计.docx')))
结果:
9.获取给定路径下的文件最后修改时间
import os
import time
print(os.path.getmtime(r'E:\OneDrive\Desktop\帮忙\毕业设计.docx'))
print(time.ctime(os.path.getmtime(r'E:\OneDrive\Desktop\帮忙\毕业设计.docx')))
结果:
10.获取给定路径下的文件大小
使用os.path.getsize()函数可以实现这一功能,返回值的结果为文件的字节数Byte,若需要转换为KB或MB或GB需要除1024.
import os
path=r'E:\OneDrive\Desktop\帮忙\毕业设计.docx'
print(f'{round(os.path.getsize(path))}B')
print(f'{round(os.path.getsize(path)/1024)}KB')
结果:
11.判断路径是否是绝对路径
使用os.path.isabs函数可以判断给定路径是否为绝对路径。
import os
print(os.path.isabs(r'D:\autowechat\pywechat'))
print(os.path.isabs(r'pywechat'))
结果:
12.判断给定路径是不是文件夹
import os
print(os.path.isdir(r'D:\autowechat\pywechat'))
结果:
13.判断给定路径下内容否是文件
import os
print(os.path.isfile(r'D:\autowechat\pywechat'))
结果:
14.判断给定路径是否是一个 NTFS 文件系统上的交接点
使用os.path.isjunction()函数可以实现这一功能,junction是 Windows NTFS 文件系统提供的一种特殊目录链接机制,类似于符号链接(Symbolic Link),但专门用于目录(而非文件)。
import os
print(os.path.isjunction(r'D:\autowechat\pywechat'))
结果:
15.判断给定路径是否为符号链接
符号链接是一种特殊的文件,它指向另一个文件或目录,类似于“快捷方式”。使用os.path.islink函数可以判断给定路径是否是符号链接
import os
print(os.path.islink(r'C:/'))
结果:
16.判断给定路径是否为挂载点
挂载点是目录树中的一个目录,通过挂载操作将磁盘的文件系统链接到这个目录,使得用户可以通过该目录访问磁盘内容。使用os.path.ismount函数可检测路径是否为挂载点
import os
print(os.path.ismount('C:\\')) #返回True
print(os.path.ismount('D:\\')) #返回True
print(os.path.ismount('C:\\Users')) #返回False
结果:
在windows系统上,不手动设定的话,驱动器字母(如 C:\,D:\
)本身就是挂载点,直接关联到磁盘分区。
17. 拼接多个路径,生成跨平台兼容的路径字符串
使用os.path.join函数可以实现这一功能
import os
print(os.path.join(r'D:/autowechat/','Pywechat'))
结果:
18.检查路径是否存在,包括悬空的符号链接
使用os.path.lexists函数即可实现上述功能,需要说明的是无论符号链接的目标是否存在,只要符号链接本身存在,就返回True。其他情况与 os.path.exists()相同(直接检查文件/目录是否存在)。
import os
print(os.path.exists(r'D:\autowechat\README.md'))
结果:
下表给出了os.path.exists()和os.path.lexists()的区别
特性 | os.path.exists() | os.path.lexists() |
---|---|---|
是否检查符号链接目标 | 是(仅当目标存在时返回 True ) | 否(只要符号链接存在就返回 True ) |
悬空符号链接 | 返回 False | 返回 True |
普通文件/目录 | 直接检查是否存在 | 直接检查是否存在 |
适用场景 | 确保路径可访问(包括链接目标) | 检测符号链接本身是否存在 |
19.规范化路径
使用os.path.normpath函数可以实现这一功能
import os
print(os.path.normpath(r'D:/autowechat\pywechat'))
结果:
其主要作用是 :移除冗余的当前目录和 上级目录。合并连续的路径分隔符(如 /
或 \
)。转换斜杠为当前操作系统的标准格式(Unix 用 /
,Windows 用 \
)。
需要注意的是os.path.normpath不检查路径是否存在:仅对字符串进行逻辑规范化,且不解析符号链接:纯字符串操作,不访问文件系统。
20. 规范化路径的大小写和斜杠格式
使用os.path.normcase函数可以实现该功能。其实现的功能因系统而异。
- Windows:
- 将所有字母转换为小写(如
C:\FILE.TXT
→c:\file.txt
)。 - 将斜杠
/
转换为反斜杠\
。
- 将所有字母转换为小写(如
- Unix/Linux:
- 保持原样(大小写敏感,不修改斜杠)。
import os
#Windows系统输出结果:"c:\foo\bar.txt"
print(os.path.normcase("C:\\FOO/bar.txt"))
#Unix系统输出结果:"/HOME/User/file"
print(os.path.normcase(r"/HOME/User/file"))
结果:
由于本人操作系统是windows,因此输出结果会将大写字母转为小写。 并且修改斜杠。
下表给出了os.path.normpath与os.path.normcase两函数的区别
特性 | os.path.normpath() | os.path.normcase() |
---|---|---|
主要作用 | 简化路径逻辑(移除 . /.. ,合并分隔符) | 统一大小写和斜杠格式 |
修改大小写 | 否 | 是(仅 Windows) |
跨平台行为差异 | 无(逻辑处理一致) | 有(Windows 小写化,Unix 保持原样) |
典型用途 | 清理用户输入的冗余路径 | 确保路径比较时的平台兼容性 |
21. 获取路径的“规范绝对路径”
使用os.realpath函数可以实现上述功能。特别地,当我们传入的是相对路径时也可以实现与os.path.abspath相同的功能,实现相对路径转绝对路径。
import os
print(os.path.realpath(r'pywechat'))
结果:
23. 获取路径的“规范相对路径”
使用os.relpath函数可以实现上述功能。
import os
print(os.path.relpath(r'D:\autowechat\pywechat'))
结果:
24. 判断给定两个路径是否指向同一文件或文件夹
使用os.path.samefile函数可以实现这一功能,特别地,该函数也同时支持绝对路径与相对路径之间相互判断。
import os
print(os.path.samefile(f1='pywechat',f2=r'D:\autowechat\pywechat'))
结果:
25. 头尾分割路径
使用os.path.split函数可以实现这一功能。需要注意的是该方法只返回最后一个‘\’的前后两部分。若给定路径正确,那么分割结果的第二部分为文件名.
import os
print(os.path.split(r'D:\autowechat\pywechat'))
结果:
26. 分割绝对路径下的磁盘卷名
使用os.path.splitdrive函数即可实现这一功能。
import os
print(os.path.splitdrive(r'D:\autowechat\pywechat'))
结果:
27 分割路径中的文件后缀名
使用os.path.splittext函数可以实现这一功能。
import os
print(os.path.splitext(r'D:\autowechat\setup.py'))
结果:
28.将路径拆分为根部分(root)和剩余部分(rest)
使用该功能需python版本≥3.12
import os.path
#普通驱动器路径
print(os.path.splitroot("C:\\Windows\\System32"))
#输出: ('C:', '\\', 'Windows\\System32')
#UNC网络路径
print(os.path.splitroot("\\\\server\\share\\file.txt"))
#输出: ('\\\\server\\share', '\\', 'file.txt')
29. 判断文件是否重复打开
当我们在代码中使用open语句打开多个文件,需要判断是否存在同一个文件被重复打开时可以使用os.path.sameopenfile函数来进行判断。
import os
with open("setup.py", "r") as f1, open("setup.py", "r") as f2:
print(os.path.sameopenfile(f1.fileno(), f2.fileno())) # 输出 True
需要注意的是os.sameopenfile()函数的参数为文件描述符,对于Io_Wrapper对象可以使用fileno() 函数来获取其文件描述符。
结果:
总结
os.path模块下绝大多数的方法都是基于字符串的正则匹配,所得的结果并不能一定保证所得结果的路径真实性,若要判断是否为真实路径可以使用os.path.exists()或os.path,lexists()加以判断。
以上便是本文所有内容,也是os.path下所有方法的使用说明。如果感到本文对你有帮助,还去一键三连支持一下博主。