每周一個(gè) Python 模塊 | os.path

本文基于 Python3 編寫測試矩父。

os.path 模塊是跨平臺的刮吧,即使不打算在平臺之間移植自己的程序也應(yīng)該用 os.path刑峡,好處多多夫晌。

解析路徑

第一組 os.path 函數(shù)可用于將表示文件名的字符串解析為其組成部分怕犁。重要的是要意識到這些功能不依賴于實(shí)際存在的路徑熟尉。

路徑解析取決于以下定義的一些 os 變量:

  • os.sep- 路徑部分之間的分隔符(例如慷荔,“ /”或“ \”)耗跛。
  • os.extsep- 文件名和文件“擴(kuò)展名”之間的分隔符(例如菊碟,“ .”)节芥。
  • os.pardir- 路徑組件,意味著將目錄樹向上遍歷一級(例如逆害,“ ..”)头镊。
  • os.curdir- 引用當(dāng)前目錄的路徑組件(例如,“ .”)魄幕。

split() 函數(shù)將路徑分成兩個(gè)獨(dú)立的部分相艇,并返回一個(gè)tuple結(jié)果。第二個(gè)元素是路徑的最后一個(gè)元素纯陨,第一個(gè)元素是它之前的所有元素坛芽。

import os.path

PATHS = [
    '/one/two/three',
    '/one/two/three/',
    '/',
    '.',
    '',
]

for path in PATHS:
    print('{!r:>17} : {}'.format(path, os.path.split(path)))
    
# output
# '/one/two/three' : ('/one/two', 'three')
# '/one/two/three/' : ('/one/two/three', '')
#               '/' : ('/', '')
#               '.' : ('', '.')
#                '' : ('', '')

當(dāng)輸入?yún)?shù)以 os.sep 結(jié)束時(shí),路徑的最后一個(gè)元素是一個(gè)空字符串翼抠。

basename()函數(shù)返回一個(gè)等于 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)))
    
# output
# '/one/two/three' : 'three'
# '/one/two/three/' : ''
#               '/' : ''
#               '.' : '.'
#                '' : ''

完整路徑被剝離到最后一個(gè)元素,無論是指文件還是目錄阴颖。

dirname()函數(shù)返回拆分路徑的第一部分:

import os.path

PATHS = [
    '/one/two/three',
    '/one/two/three/',
    '/',
    '.',
    '',
]

for path in PATHS:
    print('{!r:>17} : {!r}'.format(path, os.path.dirname(path)))
    
# output
# '/one/two/three' : '/one/two'
# '/one/two/three/' : '/one/two/three'
#               '/' : '/'
#               '.' : ''
#                '' : ''

結(jié)合basename()dirname() 的結(jié)果可以返回原始路徑活喊。

splitext()類似于split(),但在擴(kuò)展分隔符上劃分路徑量愧,而不是目錄分隔符钾菊。

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)))
    
# output
#        '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在查找擴(kuò)展名時(shí)僅匹配最后一次出現(xiàn)的分隔符,因此如果文件名具有多個(gè)擴(kuò)展名侠畔,則會(huì)按照最后一個(gè)擴(kuò)展名進(jìn)行拆分结缚。

commonprefix()將路徑列表作為參數(shù),并返回表示所有路徑中存在的公共前綴的單個(gè)字符串软棺。該值還可以表示實(shí)際上不存在的路徑红竭,并且路徑分隔符不包括在考慮中。

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))

# output
# PATH: /one/two/three/four
# PATH: /one/two/threefold
# PATH: /one/two/three/
# 
# PREFIX: /one/two/three

在此示例中,公共前綴字符串是/one/two/three茵宪,即使一個(gè)路徑不包含名為的目錄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))

# output
# PATH: /one/two/three/four
# PATH: /one/two/threefold
# PATH: /one/two/three/
# 
# PREFIX: /one/two

構(gòu)建路徑

除了將現(xiàn)有路徑分開之外暖哨,經(jīng)常需要從其他字符串構(gòu)建路徑。要將多個(gè)路徑組合為單個(gè)值凰狞,可以使用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)))
    
# output
# ('one', 'two', 'three') : 'one/two/three'
# ('/', 'one', 'two', 'three') : '/one/two/three'
# ('/one', '/two', '/three') : '/three'

如果有任何一個(gè)參數(shù)是以 os.sep 開頭的篇裁,則先前所有的參數(shù)都會(huì)被丟棄,并將該值作為返回值的開頭赡若。

也可以使用包含可以自動(dòng)擴(kuò)展的“可變”組件的路徑达布。例如,expanduser()~ 字符轉(zhuǎn)換為用戶主目錄的名稱逾冬。

import os.path

for user in ['', 'dhellmann', 'nosuchuser']:
    lookup = '~' + user
    print('{!r:>15} : {!r}'.format(lookup, os.path.expanduser(lookup)))
    
# output
#             '~' : '/Users/dhellmann'
#    '~dhellmann' : '/Users/dhellmann'
#   '~nosuchuser' : '~nosuchuser'

如果找不到用戶的主目錄黍聂,則返回字符串不變,如~nosuchuser身腻。

expandvars() 更通用产还,擴(kuò)展路徑中存在的任何 shell 環(huán)境變量。

import os.path
import os

os.environ['MYVAR'] = 'VALUE'

print(os.path.expandvars('/path/to/$MYVAR'))    # /path/to/VALUE

并不會(huì)驗(yàn)證文件或路徑是否存在嘀趟。

規(guī)范化路徑

使用join() 組合的路徑可能會(huì)有額外的分隔符或相對路徑脐区。用 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)))
    
# output
#      'one//two//three' : 'one/two/three'
#    'one/./two/./three' : 'one/two/three'
# 'one/../alt/two/three' : 'alt/two/three'

要將相對路徑轉(zhuǎn)換為絕對文件名,請使用 abspath()她按。

import os
import os.path

os.chdir('/usr')

PATHS = [
    '.',
    '..',
    './one/two/three',
    '../one/two/three',
]

for path in PATHS:
    print('{!r:>21} : {!r}'.format(path, os.path.abspath(path)))
    
# output
#                   '.' : '/usr'
#                  '..' : '/'
#     './one/two/three' : '/usr/one/two/three'
#    '../one/two/three' : '/one/two/three'

文件時(shí)間

除了使用路徑之外坡椒,os.path還包括用于檢索文件屬性的函數(shù),類似于 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__))

# output
# File         : ospath_properties.py
# Access time  : Sun Mar 18 16:21:22 2018
# Modified time: Fri Nov 11 17:18:44 2016
# Change time  : Fri Nov 11 17:18:44 2016
# Size         : 481

os.path.getatime()返回訪問時(shí)間尤溜, os.path.getmtime()返回修改時(shí)間倔叼,os.path.getctime()返回創(chuàng)建時(shí)間。 os.path.getsize()返回文件中的數(shù)據(jù)量宫莱,以字節(jié)為單位表示丈攒。

測試文件

當(dāng)程序遇到路徑名時(shí),通常需要知道路徑是指文件授霸,目錄還是符號鏈接以及它是否存在巡验。 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()
    
# output
# File        : 'ospath_tests.py'
# Absolute    : False
# Is File?    : True
# Is Dir?     : False
# Is Link?    : False
# Mountpoint? : False
# Exists?     : True
# Link Exists?: True
# 
# File        : ''
# Absolute    : False
# Is File?    : False
# Is Dir?     : False
# Is Link?    : False
# Mountpoint? : False
# Exists?     : False
# Link Exists?: False
# 
# File        : '/'
# Absolute    : True
# Is File?    : False
# Is Dir?     : True
# Is Link?    : False
# Mountpoint? : True
# Exists?     : True
# Link Exists?: True
# 
# File        : './broken_link'
# Absolute    : False
# Is File?    : False
# Is Dir?     : False
# Is Link?    : True
# Mountpoint? : False
# Exists?     : False
# Link Exists?: True

所有測試函數(shù)都返回布爾值碘耳。

相關(guān)文檔:

https://pymotw.com/3/os.path/index.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末显设,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子辛辨,更是在濱河造成了極大的恐慌捕捂,老刑警劉巖瑟枫,帶你破解...
    沈念sama閱讀 211,743評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異指攒,居然都是意外死亡慷妙,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評論 3 385
  • 文/潘曉璐 我一進(jìn)店門允悦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來膝擂,“玉大人,你說我怎么就攤上這事隙弛〖懿觯” “怎么了?”我有些...
    開封第一講書人閱讀 157,285評論 0 348
  • 文/不壞的土叔 我叫張陵全闷,是天一觀的道長绩蜻。 經(jīng)常有香客問我,道長室埋,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,485評論 1 283
  • 正文 為了忘掉前任伊约,我火速辦了婚禮姚淆,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘屡律。我一直安慰自己腌逢,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,581評論 6 386
  • 文/花漫 我一把揭開白布超埋。 她就那樣靜靜地躺著搏讶,像睡著了一般。 火紅的嫁衣襯著肌膚如雪霍殴。 梳的紋絲不亂的頭發(fā)上媒惕,一...
    開封第一講書人閱讀 49,821評論 1 290
  • 那天,我揣著相機(jī)與錄音来庭,去河邊找鬼妒蔚。 笑死,一個(gè)胖子當(dāng)著我的面吹牛月弛,可吹牛的內(nèi)容都是我干的肴盏。 我是一名探鬼主播,決...
    沈念sama閱讀 38,960評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼帽衙,長吁一口氣:“原來是場噩夢啊……” “哼菜皂!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起厉萝,我...
    開封第一講書人閱讀 37,719評論 0 266
  • 序言:老撾萬榮一對情侶失蹤恍飘,失蹤者是張志新(化名)和其女友劉穎榨崩,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體常侣,經(jīng)...
    沈念sama閱讀 44,186評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蜡饵,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,516評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了胳施。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片舞肆。...
    茶點(diǎn)故事閱讀 38,650評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡哩盲,死狀恐怖廉油,靈堂內(nèi)的尸體忽然破棺而出班巩,到底是詐尸還是另有隱情抱慌,我是刑警寧澤抑进,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布户秤,位于F島的核電站,受9級特大地震影響鲸伴,放射性物質(zhì)發(fā)生泄漏姓赤。R本人自食惡果不足惜裹唆,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,936評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望距芬。 院中可真熱鬧惧浴,春花似錦纵朋、人聲如沸操软。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,757評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽家乘。三九已至,卻和暖如春藏澳,著一層夾襖步出監(jiān)牢的瞬間仁锯,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,991評論 1 266
  • 我被黑心中介騙來泰國打工翔悠, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留业崖,地道東北人野芒。 一個(gè)月前我還...
    沈念sama閱讀 46,370評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像双炕,于是被迫代替她去往敵國和親狞悲。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,527評論 2 349

推薦閱讀更多精彩內(nèi)容

  • 官網(wǎng) 中文版本 好的網(wǎng)站 Content-type: text/htmlBASH Section: User ...
    不排版閱讀 4,370評論 0 5
  • 一妇斤、Python簡介和環(huán)境搭建以及pip的安裝 4課時(shí)實(shí)驗(yàn)課主要內(nèi)容 【Python簡介】: Python 是一個(gè)...
    _小老虎_閱讀 5,725評論 0 10
  • Pythos中調(diào)用操作系統(tǒng)的模塊摇锋,提供對操作系統(tǒng)進(jìn)行調(diào)用的接口 API方法 os.getcwd() 獲取當(dāng)前工作目...
    So_ProbuING閱讀 2,269評論 0 4
  • os.path.abspath(path) #返回絕對路徑,和realpath有區(qū)別,realpath是返回文件真...
    jova_y閱讀 809評論 0 1
  • 你會(huì)焦慮嗎 最近焦慮感越來越敏感了 只要一不寫感恩日記 那個(gè)白天就很想發(fā)火 又或許沒有及時(shí)補(bǔ)充維生素趟济,脾氣也莫名的...
    金蘭幸福旅程閱讀 161評論 0 0