Python os.path 模块详解

总结:

os.path 模块是系统路径操作模块,但实际的原理可以把它认为是处理包含斜杠("/")反斜杠("\")字符串的模块,其中,斜杠("/")是 linux 系统下的路径分隔符,和反斜杠("\")是 windows 系统下的路径分隔符。

也就是说,只要提供一个包含斜杠和反斜杠的字符串,os.path 模块都能处理,哪怕该字符串不是一个有效的真正路径,因为 os.path 模块的源码实现就是根据操作系统来处理斜杠和反斜杠的操作的。

下面逐一分析 os.path 模块下各个常用函数作用


一、操作类函数

os.path.split(path)

路径切割函数,这个函数会找到 path 的最后一个斜杠并对这个斜杠的两边字符串进行切割,得到两部分:斜杠之前的部分和斜杠之后的部分,然后把这两部分组成一个元组而返回,比如:

os.path.split('/python/demo/test.py')
>> ('/python/demo', 'test.py')

os.path.split('/python/demo/')
>> ('/python/demo', '')

从上面的例子可以看出:如果路径字符串的最后一个斜杠没有内容(只提供目录路径),那么返回的第二部分就是空字符串,而返回的这两部分内容分别叫 dirname 和 basename,分别对应 os.path.dirname() 函数和 os.path.basename()函数:

os.path.dirname('/python/demo/test.py')
>> /python/demo

os.path.basename('/python/demo/test.py')
>> test.py

我们可以看一下python源码里面的实现:

# Return the tail (basename) part of a path.

def basename(p):
    """Returns the final component of a pathname"""
    return split(p)[1]


# Return the head (dirname) part of a path.

def dirname(p):
    """Returns the directory component of a pathname"""
    return split(p)[0]

从源码我们可以很清晰的看到这两个函数返回的就是split()所分割出来的两部分


os.path.dirname(pathname)

我们把这个函数称为目录提取函数,因为它可以从下往上一层一层地嵌套提取目录路径,每调用一次就会得到少一层目录的路径,比如:

path = '/python/demo/test.py'

os.path.dirname(path)
>> /python/demo

os.path.dirname(os.path.dirname(path))
>> /python

os.path.dirname(os.path.dirname(os.path.dirname(path)))
>> /

当然,再往上提取就不会生效了,最高不会超过最后一层目录,也就是说你再继续叠加,得到的还是最后一层目录


os.path.join(path1, path2, ...)

路径合并函数,这个函数会把所有参数合并成一个路径字符串,其中除了最后一个参数之外,其它所有参数都会自动在字符串末尾添加目录分隔符(斜杠或者反斜杠),linux系统下默认添加斜杠,windows下默认添加一个反斜杠,比如:

os.path.join('/python', 'demo', 'test.py')
>> /python/demo/test.py

组合过程为:/python + sep + demo + sep + test.py,sep为系统分隔符:"/","\"


os.path.splitext(path)

扩展名分隔函数,这个函数会找到 path 的最后一个 ‘.’(不管前面有多少个’.’),然后对’.'两边进行切割得到两部分:文件路径名和扩展名,比如:

os.path.splitext('/python/demo/test.py')
>> ('/python/demo/test', '.py')

os.path.splitext('test.py')
>> ('test', '.py')

os.path.splitext('/python/demo/test')
>> ('/python/demo/test', '')

os.path.splitdrive(path)

windows系统下特有的驱动器名分割函数,比如:

os.path.splitdrive('D:\\python\\demo\\test.py')
>> ('D:', '\\python\\demo\\test.py')

驱动器名是有讲究的,必须要保证路径名的第二个字符是冒号(’:’),第一个字符可以是任意字符,也就是想要得到驱动器名,字符串就必须开头是一个字符加’:’,比如:

os.path.splitdrive('x:\\test.py')
>> ('x:', '\\test.py')

os.path.splitdrive('+:\\test.py')
>> ('+:', '\\test.py')

os.path.splitdrive('你:\\test.py')
>> ('你:', '\\test.py')

os.path.splitdrive('xx:\\test.py')
>> ('', 'xx:\\test.py')

二、转换类函数

os.path.abspath(path)

绝对路径生成函数,支持特殊路径:当前目录(’.’),上一层目录(’…’):

os.path.abspath('.')
>> /python/demo

os.path.abspath('..')
>> /python

如果提供一个空字符串则会返回当前文件所在目录的绝对路径

os.path.abspath('')
>> /python/demo

如果提供一个不带路径分割符的字符串则会返回当前目录的绝对路径再加上该字符串

os.path.abspath('test_abspath')
>> /python/demo/test_abspath

如果提供了带路径分隔符的字符串则会直接把该字符串作为绝对路径返回:

os.path.abspath('/test_abspath')
>> /test_abspath

os.path.abspath('\\test_abspath')
>> D:\\test_abspath

os.path.realpath(path)

这个函数返回给定路径(该路径下的文件为链接文件)所对应的真实文件的路径,一般用于支持 os.path.islink() 函数的操作系统,比如linux,而windows是不支持链接文件判断的


os.path.normpath(path)

这个函数的用处是规范或者是格式化路径,它会把所有路径分割符按照操作系统进行替换,如果是Linux系统,它会替换为斜杠("/"),windows下会替换为反斜杠("\"),当然,os.path.abspath()和os.path.realpath()也有这个作用

__file__:每个python文件都会有一个__file__的文件变量,这个变量存储着文件所在的路径,比如:

print(__file__)
>> /python/demo/test.py

__file__存储的路径分隔符都是斜杠的,在windows下如果想返回正确的路径分割符则可以使用路径规范函数os.path.normpath():

os.path.normpath(__file__)
>> D:\python\demo\test.py

三、判断类函数

os.path.exists(path)

函数判断给定的字符串所对应的路径是否存在,存在返回 True,否则返回 False;windows下如果目标路径为链接文件则会判断为 False:

os.path.exists('/python/demo/test.py')
>> True

os.path.isfile(path)

函数判断给定的文件路径是否是一个文件,如果是目录或者是链接符号则返回 False,如果只给定文件名而没有路径,则默认搜索路径为当前路径

os.path.isfile('/python/demo/test.py')
>> True
>os.path.isfile('test.py')
>> True

os.path.isdir(path)

函数判断给定的文件路径是否是一个目录

os.path.isdir('/python/demo/')
>> True
>os.path.isdir('test.py')
>> False

os.path.islink(path)

函数判断给定的文件路径是否是一个链接符号,这个函数不能用于windows下判断,因为在windows下是直接返回False,所以只能在linux系统下使用

os.path.islink('/python/demo/test_link')
>> True

os.path.isabs(path)

函数判断给定的文件路径是否是一个绝对路径,是的话返回True,否则返回False

os.path.isabs('/python/demo/test.py')
>> True
os.path.isabs('test.py')
>> False

os.path.ismount(path)

函数判断给定的文件路径是否是一个挂载点,是的话返回True,否则返回False

os.path.ismount('/python')
>> False
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章