前言
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)了。