生活也許偶爾糟糕屿聋,但不能它糟你就糟赖阻。數(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)判斷槽华。
有兩大類一個(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操作匆光。
大多數(shù)情況下,我們都只需要使用 Path 這個(gè)類來對(duì)具體的文件路徑進(jìn)行操作酿联,PurePath 這個(gè)類只在一些特殊情況會(huì)使用到终息,具體的情況可以參考 pathlib 的官方文檔。下面贞让,我通過對(duì)文件夾下的一堆 oracle dmp 文件的相關(guān)操作周崭,來對(duì)比展現(xiàn)模塊 pathlib 和 os.path 的差異。
總結(jié):
- pathlib本質(zhì)上調(diào)用的還是os.path() 對(duì)象 ;
- 不是所有的可迭代對(duì)象都支持負(fù)索引喳张,
構(gòu)建Path類路徑對(duì)象
pathlib中不區(qū)分路徑分隔符的,在win系統(tǒng)下可以直接用'/'续镇。還可以用 / 創(chuàng)建子路徑。感覺比直接字符串拼接和利用os.path.join()更加簡潔销部;
- 類要求大寫
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'