總結:
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 |