Pathlib庫:Python面向對象的文件路徑處理
目錄
前言
建立路徑
joinPath()
路徑格式化
with_name()與with_suffix()
解析路徑
home()與cwd()
獲取當前路徑下的所有文件路徑
設置條件獲取文件(glob()與rglob())
讀寫文件
刪除文件夾
文件屬性
文件判斷
創建快捷方式
前言
Pathlib庫提供了一個面向對象的API來解析,建立,測試和處理文件名和路徑,而不是使用底層字符串操作。
其中Pathlib庫有2個非常關鍵的類名:PurePosixPath,PureWindowsPath。它們可以在任意操作系統上實例化和使用,因為它們只處理文件名與目錄名。
要實例化一個具體的類來處理真正的文件系統,需要使用Path得到一個PosixPath或WindowsPath,至于取哪個,取決于你是什么系統。
建立路徑
下面,我們來通過Pathlib庫建立路徑。示例如下:
import pathlib users = pathlib.PurePosixPath('/Users') print(users) users_liyuanjing = users / 'liyuanjinglyj' print(users_liyuanjing) users_yellow = users / pathlib.PurePosixPath('yellow') print(users_yellow) users_etc = users / '/ect/' print(users_etc)
1
2
3
4
5
6
7
8
9
10
11
12
13
運行之后,效果如下:
如上面代碼所示,我們通過PurePosixPath實例化一個新路徑,新路徑的對象表示的就是這個字符串的值。
而像之前使用os.path.join()組合路徑,這里可以直接使用"/"符號進行拼接,即可以拼接字符串,也可以在拼接一個新路徑的PurePosixPath對象。不過,有一點和os.path.join()一樣,就是組合路徑中,一旦后面也有“/”符號,那么就會舍棄前面的路徑,比如最后的/etc路徑。
joinPath()
既然提到了os.path.join()函數,我們就先來介紹一個Pathlib庫中很像它的函數:joinPath()。它也是用于拼接路徑的,具體示例如下:
import pathlib users = pathlib.PurePosixPath() paths = ['liyuanjinglyj', 'yellow'] result = users.joinpath(*paths) print(result)
1
2
3
4
5
6
運行之后,效果如下:
路徑格式化
既然是字符串路徑,那么拼接的時候,肯定會有不規范的地方。所以,我們需要使用resolve()函數進行字符串路徑規范化,示例如下:
import pathlib users = pathlib.Path() result = users / '..' / 'liyuanjing' print(result.resolve()) users = pathlib.Path('/Users/local') result = users / '..' / 'liyuanjing' print(result.resolve())
1
2
3
4
5
6
7
8
9
運行之后,效果如下:
如上圖所示,它會自動格式化路徑,同時轉化為絕對路徑。
with_name()與with_suffix()
with_name():創建一個新路徑,將一個路徑中的文件名替換成為另一個不同的文件名。
with_suffix():創建一個新路徑,將文件名的擴展名替換為一個不同的值。
示例如下:
import pathlib one = pathlib.PurePosixPath('/base_demo/demo.py') print(one) two = one.with_name("yellow.py") print(two) three = two.with_suffix(".pyc") print(three)
1
2
3
4
5
6
7
8
運行之后,效果如下:
如上圖所示,with_name將文件名demo替換成了yellow。而with_suffix將文件名后綴py替換成了pyc。
解析路徑
既然有組合路徑,替換路徑等。那么也會有解析路徑,畢竟有時候我們只想要文件名,那么就必須分解路徑。
分解路徑會用到PurePosixPath成員變量parts,示例如下:
import pathlib one = pathlib.PurePosixPath('D:/Users/base_demo/demo.py') print(one.parts)
1
2
3
4
運行之后,效果如下:
可以看到,這里將路徑中的所有“/”分割的符號都分解了,最后一個肯定就是文件名或者文件(只有文件的話)。
既然這里,我們可以通過一層層的分解得到各個文件的名稱,那么PurePosixPath類也肯定有層級給文件名分類,比如像獲取某個文件的父目錄,可以通過如下代碼做到:
import pathlib one = pathlib.PurePosixPath('D:/Users/base_demo/demo.py') print(one.parent) print("----------") for name in one.parents: print(name)
1
2
3
4
5
6
7
運行之后,效果如下:
通過parents,我們可以一級一級的返回其父親目錄,直到根目錄為止。
這里,還有一些成員變量在實際的應用中會經常的用到,示例如下:
import pathlib one = pathlib.PurePosixPath('D:/Users/base_demo/demo.py') print(one.name) print(one.suffix) print(one.stem)
1
2
3
4
5
6
運行之后,效果如下:
name:用于獲取最后的文件名與后綴。
suffix:用于獲取文件名的后綴
stem:用于獲取文件名不要后綴
home()與cwd()
home():直接生成系統用戶目錄的路徑
cwd():用于獲取項目的絕對路徑
示例如下:
import pathlib one = pathlib.Path.home() print(one) two = pathlib.Path.cwd() print(two)
1
2
3
4
5
6
運行之后,效果如下:
獲取當前路徑下的所有文件路徑
在編寫文件夾應用之時,我們每訪問一個目錄都會顯示該目錄下的所有文件與文件夾。而Pathlib庫也能夠做到這些,具體代碼很簡單,迭代iterdir()就行,示例如下:
import pathlib one = pathlib.Path.cwd() two = pathlib.Path('.') for f1, f2 in zip(one.iterdir(), two.iterdir()): print('{} : {}'.format(f1, f2))
1
2
3
4
5
6
運行之后,效果如下:
設置條件獲取文件(glob()與rglob())
在遍歷獲取文件時,我們可能并不需要獲取所有文件,而只要獲取某些特定后綴的文件。比如上面的目錄中,我們只需要txt后綴的文本怎么辦?
可以直接使用glob()進行過濾,示例如下:
import pathlib one = pathlib.Path('.') for f in one.glob('*.txt'): print(f)
1
2
3
4
5
運行之后,效果如下:
glob()與rglob()不同之處,在于rglob()是遞歸的,比如這層測試目錄一直有一個.idea文件夾,使用glob()不會遍歷到.idea文件夾里面的文件,而rglob()就會,而且只要繼續有層級,會一直遍歷符合條件的數據。
示例如下:
import pathlib one = pathlib.Path('.') for f in one.rglob('*'): print(f)
1
2
3
4
5
運行之后,效果如下:
讀寫文件
既然通過Pathlib庫管理文件非常的方便,那么它能過讀寫文件,是不是就是一個完美的文件操作庫呢?
其實,Pathlib庫還真能直接對文件進行讀寫。下面,我們隨機創建一個文件進行讀寫操作,示例如下:
import pathlib f = pathlib.Path('text.txt') f.write_bytes("My name is Li Yuanjing".encode('utf-8')) with f.open('r',encoding='utf-8') as content: print(content.read()) print(f.read_text('utf-8'))
1
2
3
4
5
6
7
8
9
運行之后,效果如下:
這里,我們使用2種讀取文件的方式,一種是通過with f.open()讀取文件,一種是直接使用read_text()進行讀取。唯一不同的是,如果要一行一行讀取,可能前一種方式更合適。而寫入文件直接使用write_bytes()函數就行,不過需要記得給寫入內容指定編碼。(當然直接寫字符串可以用write_text()函數)
至于創建文件夾,直接使用f.mkdir()就行。
刪除文件夾
在實際的文件操作中,我們還需要刪除文件夾或者文件。而Pathlib庫給我們提供了rmdir()函數進行空文件夾的刪除,示例如下:
import pathlib f = pathlib.Path('123') f.rmdir()
1
2
3
4
如果文件夾不是空的,會直接報錯,當然如果是空的就直接成功刪除了。
如果是要刪除文件,可以使用unlink()函數進行操作,示例如下:
import pathlib f = pathlib.Path('a.txt') f.unlink()
1
2
3
4
文件屬性
在編寫文件管理器應用時,我們往往還會獲取文件的屬性,比如創建時間,修改時間等等。Pathlib庫可以很方便的獲取這些數據的集合,示例如下:
import pathlib f = pathlib.Path('英文文檔.txt') stat_info=f.stat() print(stat_info)
1
2
3
4
5
運行之后,效果如下:
這里一共獲取到文件的10個屬性,具體含義如下表:
文件判斷
os.path庫有一大堆返回布爾類型的函數進行文件的判斷,同樣的Pathlib庫也可以進行這些判斷。博主這里列出了一張表格,判斷文件的函數如下:
創建快捷方式
在Windows系統中,我們經常使用的桌面圖標就是應用程序的快捷方式,真正的exe運行程序其實在安裝目錄,而通過Pathlib庫我們也可以直接創建文件的快捷打開方式。示例如下:
import pathlib f = pathlib.Path('1234.txt') f.symlink_to('英文文檔.txt')
1
2
3
4
運行之后,你會發現打開1234.txt也就是打開了英文文檔.txt,兩者內容一樣。效果如下:
需要注意的是,直接運行程序會報錯,因為Windows生成快捷方式需要管理員權限,所以在運行腳本時,記得一定要給權限。(以管理員的方式運行)
Python 面向對象編程
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。