os.path库:Python操作和处理文件路径

发布于 2021-04-29 08:08

前言

os.path是平台独立的文件名管理库,使用该库能够很方便来处理多个平台上的文件。即使程序不打算在平台之间移植,也应当使用os.path库来完成可靠的文件名解析。

本篇博文将详细介绍os.path库的用法。

解析路径的基本用法

os.path中的第一组函数可以用来将表示文件名的字符串解析为文件名的各个组成部分。这些函数并不要求路径真正存在,它们只是单纯的处理字符串而已。

常用的解析函数如下:

import os
paths = ["D:/document/csdn/opencv/20/10.png", "D:/document/csdn/opencv/20/", "D:/document/csdn/opencv/20", "d:" + os.sep + "10" + os.extsep + "txt", os.pardir + os.sep + "10" + os.extsep + "txt", os.curdir + os.sep + "10" + os.extsep + "txt", ]
for path in paths: print(path) print(os.path.split(path))

运行之后,效果如下:

解析路径


os.sep:路径分隔符,字符串“/”或者“\”

os.extsep:文件名后缀的字符串“.”(点)

os.pardir:目录上一级,字符串“..”(双点)

os.curdir:当前目录,字符串“.”(点)

os.path.split:分割路径为两部分元组,第2个元素为路径最后的部分,可能是文件名,可能是空。第2个元素是前面的路径不包括文件名。

dirname()与basename()

当然,我们还可以不使用os.path.split进行分割,直接使用dirname()与basename()函数返回这两部分,具体代码如下:

import os
paths = ["D:/document/csdn/opencv/20/10.png", "D:/document/csdn/opencv/20/", "D:/document/csdn/opencv/20", "d:" + os.sep + "10" + os.extsep + "txt", os.pardir + os.sep + "10" + os.extsep + "txt", os.curdir + os.sep + "10" + os.extsep + "txt", ]
for path in paths: print(path) print(os.path.dirname(path)) print(os.path.basename(path))

运行之后,效果如下:

解析目录


dirname():返回文件路径最后一个分隔符前的路劲

basename():返回文件路径最后一个分隔符后面的内容

splitext()与commonprefix()

splitext()函数与split()类似,不过它会根据扩展名分隔符而不是目录分隔符来分解路径。一般我们用该方法与前面的basename()结合获取文件名。具体代码如下:

import os
path = "D:/document/csdn/opencv/20/10.png"filename = os.path.basename(path)print(os.path.splitext(filename))

这里,我们会得到文件名以及后缀。运行效果如下:

获取文件名


当然,这是在存在文件名的情况下,如果只是单纯的路径,我们会得到空字符串。而如果直接跳过basename(),我们会得到前面的路径加文件名。

至于commonprefix()函数,它是用于判断一堆路径是否具有统一的公共前缀,如果有返回公共前缀。具体代码如下:

import os
paths = ["D:/document/csdn/opencv/20/10.png", "D:/document/csdn/opencv/20/", "D:/document/csdn/opencv/20",]
for path in paths: print(path)print("公共前缀")print(os.path.commonprefix(paths))

运行之后,效果如下:

公共前缀

相信大家测试的时候,发现了一个差不多的函数:commonpath()。该函数的才是我们最长使用的,因为commonprefix()有缺陷,我们先来看一段代码:


import os
paths = ["D:/document/csdn/opencv/20/10.png", "D:/document/csdn/opencv/2011111", "D:/document/csdn/opencv/20",]
for path in paths: print(path)print("公共前缀")print(os.path.commonpath(paths))print(os.path.commonprefix(paths))

运行之后,效果如下:

效果图


可以看到,commonpath()函数返回的是共同的路径前缀,而commonprefix()虽然返回的路径存在,但不是共同的路径前缀,因为2011111是一个文件,commonprefix()将其裁成(20,1111)了。

建立路径

Join()

在实际的项目中,我们除了进行路径的分解以外,我们还可能会从其他字符串建立路径。要将多个路径组成一个值,可以使用join()。具体代码入戏所示:

import os
paths = [['one', 'two', 'thress'], ['/', 'tow', 'one', 'three'], ['/one', '/two', '/three']]
for path in paths: print(path) print(os.path.join(*path))

运行之后,效果如下:

组合链接


需要注意的是,如果链接的参数有“/”开头,那么前面所有的参数将会被丢弃,如/three一样。

expanduser()

os.path还提供了直接主目录名拼接方法:expanduser()。它会将字符串“~”开头的路径转换为主目录路径。具体代码如下:

import os
paths = ['~Data','~Temp','~Hello']
for path in paths: print(