1. os.path平臺獨立的檔案名管理
利用os.path模塊中包含的函式,很容易撰寫代碼來處理多個平臺上的檔案,即使程式不打算在平臺之間移植,也應當使用os.path來完成可靠的檔案名決議,
1.1 決議路徑
os.path中的第一組函式可以用來將表示檔案名的字串決議為檔案名的各個組成部分,這些函式并不要求路徑真正存在:它們只是處理字串,
路徑決議依賴于os中定義的一些變數:
os.sep:路徑各部分之間的分隔符(例如,“/”或“\”),
os.extsep:檔案名與檔案“擴展名”之間的分隔符(例如“.”),
os.pardir:路徑中表示目錄樹上一級的部分(例如:“..”),
os.curdir:路徑中指示當前目錄的部分(例如:“.”),
split()函式將路徑分解為兩個單獨的部分,并回傳包含這些結果的一個tuple,這個tuple的第二個元素是路徑的最后一部分,第一個元素則是此前的所有內容,
import os.path PATHS = [ '/one/two/three', '/one/two/three/', '/', '.', '', ] for path in PATHS: print('{!r:>17} : {}'.format(path, os.path.split(path)))
輸入引數以os.sep結尾時,路徑的最后一個元素是一個空串,

basename()函式回傳的值等價于split()值的第二部分,
import os.path PATHS = [ '/one/two/three', '/one/two/three/', '/', '.', '', ] for path in PATHS: print('{!r:>17} : {!r}'.format(path, os.path.basename(path))
整個路徑會剝除到只剩下最后一個元素,不論這指示的是一個檔案還是一個目錄,如果路徑以目錄分隔符結尾(os.sep),則認為基本部分為空,

dirname()函式回傳分解路徑得到的第一部分,
import os.path PATHS = [ '/one/two/three', '/one/two/three/', '/', '.', '', ] for path in PATHS: print('{!r:>17} : {!r}'.format(path, os.path.dirname(path)))
將basename()的結果與dirname()結合可以得到原來的路徑,

splitext()的作業類似于split(),不過它會根據擴展名分隔符而不是目錄分隔符來分解路徑,
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)))
查找擴展名時,只使用os.extsep的最后一次出現,所以如果一個檔案名有多個擴展名,那么分解這個檔案名時,部分擴展名會留在前綴上,

commonprefix()取一個路徑串列作為引數,并且回傳一個字串,表示所有路徑中都出現的公共前綴,這個值可能表示一個根本不存在的路徑,而且并不考慮路徑分隔符,所以這個前綴可能并不落在一個分隔符邊界上,
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))
在這個例子中,公共前綴字串是/one/two/three,盡管其中一個路徑并不包括一個名為three的目錄,

commonpath()則要考慮路徑分隔符,它回傳的前綴不包括部分路徑值,
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))
由于“threefold”在“three”后面沒有一個路徑分隔符,所以公共前綴為/one/two,

1.2 建立路徑
除了分解現有的路徑,還經常需要從其他字串建立路徑,要將多個路徑組成部分結合為一個值,可以使用join(),
import os.path PATHS = [ ('one', 'two', 'three'), ('/', 'one', 'two', 'three'), ('/one', '/two', '/three'), ] for parts in PATHS: print('{} : {!r}'.format(parts, os.path.join(*parts)))
如果要連接的某個引數以os.sep開頭,那么前面的所有引數都會被丟棄,并且這個新引數會成為回傳值的開始部分,

還可以處理包含“可變”部分的路徑,這些“可變”部分可以自動擴展,例如,expanduser()可以將波浪線(~)字串轉換為用戶主目錄名,
import os.path for user in ['', 'dhellmann', 'nosuchuser']: lookup = '~' + user print('{!r:>15} : {!r}'.format( lookup, os.path.expanduser(lookup)))
如果用戶的主目錄無法找到,那么字串將不做任何改動并直接回傳,如下面這個例子中的~nosuchuser,

expandvars()更為通用,它會擴展路徑中出現的所有shell環境變數,
import os.path import os os.environ['MYVAR'] = 'VALUE' print(os.path.expandvars('/path/to/$MYVAR'))
這里不會完成任何驗證來確保變數值能夠得到真正存在的檔案名,

1.3 規范化路徑
使用join()或利用嵌入變數由單獨的字串組合路徑時,得到的路徑最后可能會有多余的分隔符或相對路徑部分,使用normpath()可以清除這些內容,
import os.path PATHS = [ 'one//two//three', 'one/./two/./three', 'one/../alt/two/three', ] for path in PATHS: print('{!r:>22} : {!r}'.format(path, os.path.normpath(path)))
這里會估算并折疊os.curdir和os.pardir構成的路徑段,

要把一個相對路徑轉換為一個絕對檔案名,可以使用abspath(),
import os import os.path os.chdir('/') PATHS = [ '.', '..', './one/two/three', '../one/two/three', ] for path in PATHS: print('{!r:>21} : {!r}'.format(path, os.path.abspath(path)))
結果是一個從檔案系統數最頂層開始的完整的路徑,

1.4 檔案時間
除了處理路徑,os.path還包括一些用于獲取檔案屬性的函式,類似于os.stat()回傳的結果,
import os.path import time print('File :', __file__) print('Access time :', time.ctime(os.path.getatime(__file__))) print('Modified time:', time.ctime(os.path.getmtime(__file__))) print('Change time :', time.ctime(os.path.getctime(__file__))) print('Size :', os.path.getsize(__file__))
os.path.getatime()回傳訪問時間,os.path.getmtime()回傳修改時間,os.path.getctime()回傳創建時間,os.path.getsize()回傳檔案中的資料量,以位元組為單位表示,

1.5 測驗檔案
程式在遇到一個路徑名時,通常需要知道這個路徑指示的是一個檔案、目錄還是一個符號連接(symlink),另外還要知道它是否確實存在,os.path包含了一些用于測驗所以這些條件的函式,
import os.path FILENAMES = [ __file__, os.path.dirname(__file__), '/', './broken_link', ] for file in FILENAMES: print('File : {!r}'.format(file)) print('Absolute :', os.path.isabs(file)) print('Is File? :', os.path.isfile(file)) print('Is Dir? :', os.path.isdir(file)) print('Is Link? :', os.path.islink(file)) print('Mountpoint? :', os.path.ismount(file)) print('Exists? :', os.path.exists(file)) print('Link Exists?:', os.path.lexists(file)) print()
所有這些測驗函式都回傳布林值,

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/178816.html
標籤:Python
上一篇:報錯(持續.....)
