解析路径
os . path 中的第一组函数可以用来将表示文件名的字符串解析为文件名的各个组成部分。这些函数并不要求路径真正存在:它们只是处理字符串。
路径解析依赖于os中定义的一些变量:
os.sep:路径各部分之间的分隔符(例如,“/”或“\”)。
os .extsep:文件名与文件“扩展名”之间的分隔符(例如“.”)。
os.pardir:路径中表示目录树上一级的部分(例如“..”)。
os.curdir:路径中指示当前目录的部分(例如“.”)。
split()函数将路径分解为两个单独的部分,并返回包含这些结果的一个tuple。这个tuple的第二个元素是路径的最后一部分,第一个元素则是此前的所有内容。
新建ospath_split.py文件。
import os.path
PATHS = [
'/one/two/three',
'/one/two/three/',
'/',
'.',
'',
]
for path in PATHS:
print('{!r:>17} : {}'.format(path, os.path.split(path)))
以上代码输出结果为:
'/one/two/three' : ('/one/two', 'three')
'/one/two/three/' : ('/one/two/three', '')
'/' : ('/', '')
'.' : ('', '.')
'' : ('', '')
以上代码,输入参数以os.path结尾时,路径的最后一个元素是一个空串。
basename()函数返回的值等价于split()值的第二部分。
新建ospath_basename.py文件。
import os.path
PATHS = [
'/one/two/three',
'/one/two/three/',
'/',
'.',
'',
]
for path in PATHS:
print('{!r:>17} : {!r}'.format(path, os.path.basename(path)))
以上代码输出结果为:
'/one/two/three' : 'three'
'/one/two/three/' : ''
'/' : ''
'.' : '.'
'' : ''
以上代码,整个路径会剥除到只剩下一个元素,不论这指示的是一个文件还是一个目录。如果路径以目录分隔符结尾,则认为基本部分为空。
dirname()函数返回分解路径得到的第一部分。
新建ospath_dirname.py文件。
import os.path
PATHS = [
'/one/two/three',
'/one/two/three/',
'/',
'.',
'',
]
for path in PATHS:
print('{!r:>17} : {!r}'.format(path, os.path.dirname(path)))
以上代码输出结果为:
'/one/two/three' : '/one/two'
'/one/two/three/' : '/one/two/three'
'/' : '/'
'.' : ''
'' : ''
以上代码,将basename()的结尾与dirname()结合可以得到原来的路径。
splitext()的工作类似于split(),不过它会根据扩展名分隔符而不是目录分隔符来分解路径。
新建ospath_splitext.py文件。
import os.path
PATHS = [
'filename.txt',
'filename',
'/path/to/filename.txt',
'/',
'',
'my-archive.tar.gz',
'no-extension.',
]
for path in PATHS:
print('{!r:>21} : {!r}'.format(path, os.path.splitext(path)))
以上代码输出结果为:
'filename.txt' : ('filename', '.txt')
'filename' : ('filename', '')
'/path/to/filename.txt' : ('/path/to/filename', '.txt')
'/' : ('/', '')
'' : ('', '')
'my-archive.tar.gz' : ('my-archive.tar', '.gz')
'no-extension.' : ('no-extension', '.')
以上代码,查找扩展名时,只使用os.extsep的最后一次出现,所有如果一个文件有多个扩展名,那么分解这个文件名时,部分扩展名会在前缀上。
commonprefix()取一个路径列表作为参数,并且返回一个字符串,表示所有路径中都出现的公共前缀。这个值可能表示一个根本不存在的路径,而且并不考虑路径分隔符,所以这个前缀可能并不落在一个分隔符边界上。
新建ospath_commonprefix.py文件。
import os.path
paths = ['/one/two/three/four',
'/one/two/threefold',
'/one/two/three/',
]
for path in paths:
print('PATH:', path)
print()
print('PREFIX:', os.path.commonprefix(paths))
以上代码输出结果为:
PATH: /one/two/three/four
PATH: /one/two/threefold
PATH: /one/two/three/
PREFIX: /one/two/three
以上代码,公共前缀字符串是/one/two/three,尽管其中一个路径并不包括一个名为three的目录。
commonpath()则要考虑路径分隔符。它返回的前缀不包括部分路径值。
新建ospath_commonpath.py文件。
import os.path
paths = ['/one/two/three/four',
'/one/two/threefold',
'/one/two/three/',
]
for path in paths:
print('PATH:', path)
print()
print('PREFIX:', os.path.commonpath(paths))
以上代码输出结果为:
PATH: /one/two/three/four
PATH: /one/two/threefold
PATH: /one/two/three/
PREFIX: \one\two
以上代码,由于“threefold”在“three”后面没有一个路径分隔符,所以公共前缀为/one/two。