21.4-Path對(duì)象路徑基本操作——pathlib庫

生活也許偶爾糟糕屿聋,但不能它糟你就糟赖阻。數(shù)學(xué)里負(fù)負(fù)得正,生活里負(fù)負(fù)會(huì)更負(fù)限煞。

為了讓這個(gè)得數(shù)負(fù)得不那么明顯庇绽,麻煩你在生活糟糕的時(shí)候锡搜,也不要自怨自艾、自暴自棄瞧掺,依然可以從容有序耕餐,不放棄每一點(diǎn)變好的努力。


參考:
你應(yīng)該使用pathlib替代os.path

pathlib模塊

Python 3.4引入了更好的路徑處理方式:pathlib辟狈!支持不同的操作系統(tǒng)肠缔。我們只需要新建一個(gè)Path()對(duì)象夏跷,將路徑或者文件傳入,然后用/將它們連接即可明未,pathlib會(huì)幫我們做系統(tǒng)判斷槽华。

os.path 與 pathlib 模塊對(duì)應(yīng)關(guān)系

有兩大類一個(gè)是純路徑不帶I/0操作,另一個(gè)可以進(jìn)行I/0的類趟妥。
總的來說猫态,這些表示文件路徑的類分為兩類:純路徑 (pure paths) 和具體路徑 (concrete path)。
純路徑對(duì)應(yīng)的類是 PurePath煮纵,不包含 I/O 操作懂鸵;具體路徑對(duì)應(yīng)的類是 Path ,繼承自 PurePath行疏,但包含了對(duì)該文件路徑的 I/O操作匆光。
pathlib 模塊類繼承關(guān)系

大多數(shù)情況下,我們都只需要使用 Path 這個(gè)類來對(duì)具體的文件路徑進(jìn)行操作酿联,PurePath 這個(gè)類只在一些特殊情況會(huì)使用到终息,具體的情況可以參考 pathlib 的官方文檔。下面贞让,我通過對(duì)文件夾下的一堆 oracle dmp 文件的相關(guān)操作周崭,來對(duì)比展現(xiàn)模塊 pathlib 和 os.path 的差異。

總結(jié):

  1. pathlib本質(zhì)上調(diào)用的還是os.path() 對(duì)象 ;
  2. 不是所有的可迭代對(duì)象都支持負(fù)索引喳张,
構(gòu)建Path類路徑對(duì)象

pathlib中不區(qū)分路徑分隔符的,在win系統(tǒng)下可以直接用'/'续镇。還可以用 / 創(chuàng)建子路徑。感覺比直接字符串拼接和利用os.path.join()更加簡潔销部;

  1. 類要求大寫
from pathlib import Path,PurePath  # 類要求大寫摸航;
p = Path()   # 當(dāng)前目錄
p
#-----------------------------------
WindowsPath('.')

p = Path('a','b','c','d')  # 當(dāng)前目錄下的a/b/c/d
p0 = Path('/etc')    # g跟下的etc目錄;
print(p.absolute())
#----------------------------------------------------------------
C:\Users\Administrator\Desktop\mage_edu\21 Python文件IO(二)文件操作\a\b\c\d

p = Path('a/b/c\d')
print(p.absolute())
#------------------------------------------------------------------
C:\Users\Administrator\Desktop\mage_edu\21 Python文件IO(二)文件操作\a\b\c\d


#直接傳進(jìn)一個(gè)完整字符串
p = Path('C:/Users/dongh/Documents/python_learn/pathlib_/file1.txt')

#也可以傳進(jìn)多個(gè)字符串
p = Path('C:\\', 'Users', 'dongh', 'Documents', 'python_learn', 'pathlib_', 'file1.txt')
#也可以利用Path.joinpath()
p = Path('C:/Users/dongh/Documents).joinpath('python_learn/pathlib_/file1.txt')
#PosixPath('C:/Users/dongh/Documents/python_learn/pathlib_/file1.txt')

#利用 / 可以創(chuàng)建子路徑
p = Path('C:/Users/dongh/Documents)
p = p / 'python_learn/pathlib_/file1.txt'
print(p)
#PosixPath('C:/Users/dongh/Documents/python_learn/pathlib_/file1.txt')

了解對(duì)象基本情況

獲取上一級(jí)路徑

p = Path('C:/Users/dongh/Documents/python_learn/pathlib_/file1.txt')
#獲取路徑上一級(jí)目錄路徑
print(p.parent)#pathlib_\folder1
#獲取上上一級(jí)目錄路徑
print(p.parent.parent)
#----------------------------------------------------------------------------------
C:\Users\dongh\Documents\python_learn\pathlib_
C:\Users\dongh\Documents\python_learn

獲取路徑組件名字(返回的是字符串)

str 獲取路徑字符串
bytes 獲取路徑字符串的bytes

bytes 是 str 的二進(jìn)制文本模式

路徑的不同部分可以方便地用作屬性舅桩。 基本的例子包括:

.name : 沒有任何目錄的文件名
.parent: 包含該文件的目錄酱虎,或者如果path是目錄,則是父目錄
.stem: 文件名不帶后綴
.suffix: 文件擴(kuò)展名
.anchor: 目錄之前的路徑部分
#獲取當(dāng)前路徑文件名的后綴名
#獲取當(dāng)前路徑文件名不帶后綴
#獲取當(dāng)前路徑文件名帶后綴
print(p.suffix)
print(p.stem)
print(p.name)#pathlib_\folder1

p2 = p1 / 'test.tar.gz'
p2.name,p2.stem,p2.suffix,p2.suffixes
#-----------------------------------------------
('test.tar.gz', 'test.tar', '.gz', ['.tar', '.gz'])


#獲取上一級(jí)目錄路徑名字
print(p.parent.name)
#獲取上上一級(jí)目錄路徑名字
print(p.parent.parent.name)
#--------------------------------------------------------
.txt
file1
file1.txt
pathlib_
python_learn

str(p)
#---------------------------
'a'

bytes(p)
#---------------------------
b'a'

bytes(p) + b'\c'
#---------------------------
b'a\\c'

路徑拼接

操作符/
Path對(duì)象 / Path對(duì)象
Path對(duì)象/字符串 或者 字符串/Path對(duì)象

p = Path('/etc','sysconfig','network/test')
p
#---------------------------------------------
WindowsPath('/etc/sysconfig/network/test')


p / 'c' / 'd'
#----------------------------------------------------------------------
WindowsPath('/etc/sysconfig/network/test/c/d')

p1 = p / 'c' / 'd' / 'e' / p
p1 
#----------------------------------
WindowsPath('c/d/e')
將路徑分成不同組分(返回一個(gè)元組)
print(p.parts)
#--------------------------------------------------------
('C:\\', 'Users', 'dongh', 'Documents', 'python_learn', 'pathlib_', 'file1.txt')

joinpath

joinpath(*other) 鏈接多個(gè)字符串到Path對(duì)象中擂涛;

p = Path()
p = p/'a'
p1 = 'b'/p
p2 = Path('c')
p3 = p2 / p1
print(p3.parts)
p3.joinpath('etc','init.d',Path('httpd'))
#---------------------------------------------------------------------------
('c', 'b', 'a')
WindowsPath('c/b/a/etc/init.d/httpd')

深入了解對(duì)象

哈哈读串,簡單了解對(duì)象的是不夠的~~~萬一對(duì)象不存在呢

判斷對(duì)象屬性 -
p.exists() 判斷對(duì)象是否存在
p.is_file() 判斷對(duì)象是否是文件
p.is_dir() 判斷對(duì)象是否是目錄
全局方法 -
cwd() 返回當(dāng)前工作目錄
home() 返回當(dāng)前家目錄

pathlib.Path 類。創(chuàng)建路徑有幾種不同的方式撒妈。首先恢暖,有類方法,如.cwd(當(dāng)前工作目錄)和.home(用戶的主目錄):

from pathlib import Path

now_path = Path.cwd()
home_path = Path.home()

print("當(dāng)前工作目錄",now_path,type(now_path))
print("home目錄",home_path,type(home_path))
--------------------------------------------------------------------------
當(dāng)前工作目錄 C:\Users\Administrator\Desktop\mage_edu\21 Python文件IO(二)文件操作 <class 'pathlib.WindowsPath'>
home目錄 C:\Users\Administrator <class 'pathlib.WindowsPath'>

實(shí)例踩身、對(duì)象胀茵、類的方法

方法
p.chmod(777) 修改目錄權(quán)限
a.read_text() # 讀取文件內(nèi)容
(a.name) # prints "Iris.csv" 獲取文件名
a.suffix #prints ".csv" 獲取后綴
a.parts # ('data', 'data2', 'Iris.csv') # 分離路徑
rmdir() 刪除目錄
exists() 目錄或文件是否存在
p.resolve() # 將路徑絕對(duì)化
Path.home() # home路徑
p.with_name('sibling.png') # 只修改拓展名, 不會(huì)修改源文件
p.with_suffix('.jpg') # 只修改拓展名, 不會(huì)修改源文件
判斷方法

存在的東西才可以判斷

方法
p.is_dir() # 判斷是否為目錄
p.is_file() # 判斷是否為文件夾
p.is_symlink() # 判斷是否為軟連接
p.is_socket() # 判斷是否為socket文件
p.is_block_device() # 判斷是否為塊設(shè)備
p.is_char_device() # 判斷是否是字符設(shè)備
p.is_absolute() # 判斷是否為絕對(duì)路徑
- -
Path('./tet1.txt').touch() 創(chuàng)建文件對(duì)象(Linux下會(huì)有權(quán)限)
touch(mode=0o666,exits_ok=True) 創(chuàng)建一個(gè)文件
resolve() 返回一個(gè)新的路徑,為當(dāng)前Path對(duì)象的絕對(duì)路徑挟阻,如果是軟連接則直接被解析
absolute() 獲取絕對(duì)路徑
rmdir() 刪除空目錄,沒有提供判斷目錄為空的方法
as_uri 將路徑返回成URI,例如'file://etc/passwd'
p.mkdir(mode=511, parents=False, exist_ok=False) 創(chuàng)建目錄,參數(shù)exist_ok 3.5才有的
iterdir() 迭代目錄中的文件(帶. 文件) list(Path('./tmp').iterdir()),[WindowsPath('tmp/test.txt'), WindowsPath('tmp/test1.txt')]
# 遍歷并判斷文件類型附鸽,如果是目錄是否可以判斷其是否為空脱拼?
for x in p.parents[len(p.parents)-1].iterdir():
    print(x,end='\t')
    if x.is_dir():
        flag = False
        for _ in x.iterdir():
            flag = True
            break     
        # for 循壞是否可以使用else子句;
        print('dir','Not Empty' if flag else 'Empyt',sep='\t')
    elif x.is_file():
        print('file')
    else:
        print('other file')
#----------------------------------------------------------------------------
.ipynb_checkpoints  dir Not Empty
21.1-習(xí)題base64解碼.ipynb   file
21.2-習(xí)題命令分發(fā)器坷备、copy和單詞統(tǒng)計(jì).ipynb    file
21.3-StringIO和BytesIO和os.path.ipynb file
21.4-Path對(duì)象基本操作——pathlib模塊.ipynb    file
sample.txt  file
tet1.txt    file
text.py file
tmp dir Not Empty

取上級(jí)目錄的內(nèi)部實(shí)現(xiàn)
p.absolute().parents[len(p.absolute().parents)-1].iterdir()
#----------------------------------------------------------------------------------
<generator object Path.iterdir at 0x000001E18EAAD5E8>

遍歷文件夾下的路徑

#p指向的是一個(gè)文件不是文件夾熄浓。它的上一級(jí)才是文件
for i in p.parent.iterdir():
    print(i,)
"""
C:\Users\dongh\Documents\python_learn\pathlib_\file1
C:\Users\dongh\Documents\python_learn\pathlib_\file2
C:\Users\dongh\Documents\python_learn\pathlib_\folder1
C:\Users\dongh\Documents\python_learn\pathlib_\folder2
C:\Users\dongh\Documents\python_learn\pathlib_\folder3
C:\Users\dongh\Documents\python_learn\pathlib_\test.py
C:\Users\dongh\Documents\python_learn\pathlib_\file1.txt
"""

for x in p.parents[len(p.parents)-1].iterdir():
    print(x)
#----------------------------------------------------------------------------------
.ipynb_checkpoints
21.1-習(xí)題base64解碼.ipynb
21.2-習(xí)題命令分發(fā)器、copy和單詞統(tǒng)計(jì).ipynb
21.3-StringIO和BytesIO和os.path.ipynb
21.4-Path對(duì)象基本操作——pathlib模塊.ipynb
sample.txt
tet1.txt
text.py
tmp


In : p = Path('/Users/dongweiming/test')
In : p.parents[0]
Out: PosixPath('/Users/dongweiming')

In : p.parents[1]
Out: PosixPath('/Users')

In : p.parents[2]
Out: PosixPath('/')

In : p.parent
Out: PosixPath('/Users/dongweiming')

In : p.parent.parent
Out: PosixPath('/Users')



for x in p.absolute().parents[len(p.absolute().parents)-1].iterdir():
    print(x)
#----------------------------------------------------------------------------------
C:\$RECYCLE.BIN
C:\$WINDOWS.~BT
C:\$Windows.~WS
C:\360SANDBOX
C:\Boot
C:\bootmgr
C:\BOOTNXT
C:\Documents and Settings
C:\DrvPath
C:\inetpub
C:\pagefile.sys
C:\Program Files
C:\Program Files (x86)
C:\ProgramData
C:\Recovery
C:\swapfile.sys
C:\System Volume Information
C:\Temp
C:\test.txt
C:\Users
C:\Windows

有目的尋找

#* 表示匹配任意字符串省撑,但這只能在當(dāng)前目錄下尋找
for i in p.parent.glob('*.txt'): 
   print(i)
#-------------------------------------------------------------------
C:\Users\dongh\Documents\python_learn\pathlib_\file1.txt
C:\Users\dongh\Documents\python_learn\pathlib_\file2.txt


#尋找當(dāng)前路徑的下一路徑的內(nèi)容
for i in p.parent.glob('*/*.txt'):    
   print(i)
#--------------------------------------------------------------------------------------------------
C:\Users\dongh\Documents\python_learn\pathlib_\folder1\folder_file1.txt
C:\Users\dongh\Documents\python_learn\pathlib_\folder2\folder2.txt


#尋找當(dāng)前路徑下所有符合條件文件
#' ** '意思當(dāng)前路徑和它的所有子路徑赌蔑,相當(dāng)于循環(huán)匹配一遍子路徑
#和Path.rglob()效果一樣
for i in p.parent.glob('**/*.txt'):#for i in p.parent.rglob('*.txt') 
   print(i)
#-----------------------------------------------------------------------------
C:\Users\dongh\Documents\python_learn\pathlib_\file1.txt
C:\Users\dongh\Documents\python_learn\pathlib_\file2.txt
C:\Users\dongh\Documents\python_learn\pathlib_\folder1\folder_file1.txt
C:\Users\dongh\Documents\python_learn\pathlib_\folder1\sub_folder1\sub_file1.txt
C:\Users\dongh\Documents\python_learn\pathlib_\folder2\folder2.txt

對(duì)對(duì)象動(dòng)點(diǎn)手腳

寫入數(shù)據(jù)

#寫入二進(jìn)制數(shù)據(jù)
p.write_bytes(b'hello world!')
#寫入文本
p.write_text('hello world!')
#------------------------------------------------
'hello world!'

讀取數(shù)據(jù)

#讀二進(jìn)制數(shù)據(jù)
print(p.read_bytes())
#b'hello world!'

#讀文本
p.read_text()
#'hello world!'

Path.open()和內(nèi)置open()差不多

    print(f.read())
#hello world!
with p.open('w') as f:
    f.write('hello again!')

給對(duì)象改個(gè)名字

p.rename('new_file.txt')
#原來的'file1.txt'被改成new_file.txt',文件內(nèi)的內(nèi)容不變竟秫。

創(chuàng)造新的路徑

p.mkdir()
#將創(chuàng)建一個(gè)名為p.name的新文件夾娃惯。
p.rmdir()
#將刪除這個(gè)文件夾,它必須是空的才能夠刪除

判斷文件是否一樣

print(p.samefile('file1.txt'))
#返回True

改變新的路徑或后綴名并返回新的路徑(原來的路徑不被改變)

print(p.with_name('new_file1.txt'))
#--------------------------------------------------
'C:/Users/dongh/Documents/python_learn/pathlib_/new_file1.txt'
print(p.with_suffix('.csv'))
#--------------------------------------------------
'C:/Users/dongh/Documents/python_learn/pathlib_/file1.csv'
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末肥败,一起剝皮案震驚了整個(gè)濱河市趾浅,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌馒稍,老刑警劉巖皿哨,帶你破解...
    沈念sama閱讀 217,185評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異纽谒,居然都是意外死亡证膨,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門鼓黔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來央勒,“玉大人,你說我怎么就攤上這事请祖《┩幔” “怎么了?”我有些...
    開封第一講書人閱讀 163,524評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵肆捕,是天一觀的道長刷晋。 經(jīng)常有香客問我,道長慎陵,這世上最難降的妖魔是什么眼虱? 我笑而不...
    開封第一講書人閱讀 58,339評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮席纽,結(jié)果婚禮上捏悬,老公的妹妹穿的比我還像新娘。我一直安慰自己润梯,他們只是感情好过牙,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,387評(píng)論 6 391
  • 文/花漫 我一把揭開白布甥厦。 她就那樣靜靜地躺著,像睡著了一般寇钉。 火紅的嫁衣襯著肌膚如雪刀疙。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,287評(píng)論 1 301
  • 那天扫倡,我揣著相機(jī)與錄音谦秧,去河邊找鬼。 笑死撵溃,一個(gè)胖子當(dāng)著我的面吹牛疚鲤,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播缘挑,決...
    沈念sama閱讀 40,130評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼集歇,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了卖哎?” 一聲冷哼從身側(cè)響起鬼悠,我...
    開封第一講書人閱讀 38,985評(píng)論 0 275
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎亏娜,沒想到半個(gè)月后焕窝,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,420評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡维贺,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,617評(píng)論 3 334
  • 正文 我和宋清朗相戀三年它掂,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片溯泣。...
    茶點(diǎn)故事閱讀 39,779評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡虐秋,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出垃沦,到底是詐尸還是另有隱情客给,我是刑警寧澤,帶...
    沈念sama閱讀 35,477評(píng)論 5 345
  • 正文 年R本政府宣布肢簿,位于F島的核電站靶剑,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏池充。R本人自食惡果不足惜桩引,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,088評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望收夸。 院中可真熱鬧坑匠,春花似錦、人聲如沸卧惜。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至手幢,卻和暖如春捷凄,著一層夾襖步出監(jiān)牢的瞬間忱详,已是汗流浹背围来。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評(píng)論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留匈睁,地道東北人监透。 一個(gè)月前我還...
    沈念sama閱讀 47,876評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像航唆,于是被迫代替她去往敵國和親胀蛮。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,700評(píng)論 2 354