pathlib模塊

1、pathlib庫官方定義

pathlib 是Python內置庫,Python 文檔給它的定義是 Object-oriented filesystem paths(面向對象的文件系統路徑)。pathlib 提供表示文件系統路徑的類,其語義適用於不一樣的操做系統。路徑類在純路徑之間劃分,純路徑提供純粹的計算操做而沒有 I / O,以及具體路徑,它繼承純路徑但也提供 I / O 操做。python

對於這繁瑣而又冗餘的話,聽起來必定讓人不習慣。那就對了,由於這是使用谷歌翻譯直譯過來的,說到這我怎麼感受我要回去偷偷補個英語,可是注意了,接下來大白話的語述並不影響你去了解並使用他。app

2、os和pathlib.Path的區別

相對於 os 模塊的 path 方法,Python3 標準庫 pathlib 模塊的 Path 對路徑的操做會更簡單。ide

2.1 獲取當前文件路徑

使用 os 模塊時,經過 getcwd() 方法能夠直接獲取當前文件路徑(在 Pycharm 中,可使用 os.path.dirname(__file__) 獲取當前文件路徑,由於 Python 並無提供 __file__ 這個概念,他是 Pycharm 提供的):測試

# python語言實現

# /Users/mac/test.py
import os

print(os.getcwd())  # '/Users/mac'

在 pathlib 模塊中,經過 Path.cwd() 方法能夠直接獲取當前文件路徑,咱們能夠動手試一試:this

# python語言實現

# /Users/mac/test.py
import pathlib

print(pathlib.Path.cwd())  # PosixPath('/Users/mac')

經過 Pycharm 咱們可使用快捷鍵 ctrl+鼠標左鍵 點擊查看該方法的詳細介紹,以下圖所示:spa

從上圖中能夠看出 cwd() 方法不過是對 os 庫中 getcwd() 方法進行了封裝,看起來好像更差勁了,可是官方的推出必定不是子虛烏有的,如今讓咱們一塊兒來揭祕。操作系統

2.2 獲取上層/上層目錄

上面那個案例彷彿讓 pashlib 庫的使用變得更加複雜了,爲了揭祕,咱們只能一同感覺下 pathlib 庫的構成,瞭解 pathlib 庫如何帶給咱們便捷。翻譯

在 os 模塊中,若是咱們要獲取某一個文件的父目錄,os 模塊的寫法爲:code

# python語言實現

# /Users/mac/test.py
import os

print(os.path.dirname(os.path.dirname(os.getcwd())))  # /Users

在 pathlib 庫中,能夠經過這樣簡潔方法實現:對象

# python語言實現

# /Users/mac/test.py
import pathlib

print(pathlib.Path.cwd().parent)   # /Users

這段代碼看起來是否是更符合 Pythonic ?像寫英語同樣。不對,這個時候的我不該該在補英語嗎?/偷笑

而且,若是你須要找他爺爺,是否是再來一個 .parent 就好了。相比較 os 模塊的 os.path.dirname() 是否是方便太多太多了?

2.3 路徑拼接

若是你要在他父目錄中拼接路徑,經過 os 模塊你可能須要寫這麼一長串代碼:

# python語言實現

# /Users/mac/test.py
import os

print(os.path.join(os.path.dirname(os.getcwd()), '路徑拼接', '真麻煩'))  # /Users/路徑拼接/真麻煩

當你使用 pathlib 的時候,咱們一塊兒來感覺他的便捷之處吧!

# python語言實現

# /Users/mac/test.py
import os

paths = ('路徑拼接', '真麻煩')
print(pathlib.Path.cwd().parent.joinpath(*paths))  # /Users/路徑拼接/真麻煩

經過 pathlib 庫拼接路徑,你能夠很方便的調節他在他祖輩的位置,妙哉。

2.4 其餘封裝

pathlib 封裝了不少的 os.path 中的方法,以下所示:

# python語言實現

os.path.expanduser() --> pathlib.Path.home()
os.path.expanduser() --> pathlib.Path.expanduser()
os.stat() --> pathlib.Path.stat()
os.chmod() --> pathlib.Path.chmod()

3、pathlib.PurePath的使用

上一節的操做大部分都是經過 pathlib 庫中的 Path 實現,其實他還有一個更加高大上的模塊,也就是咱們這一節的主角:pathlib.PurePath

PurePath 是一個純路徑對象,純路徑對象提供了實際上不訪問文件系統的路徑處理操做。有三種方法能夠訪問這些類,咱們也稱之爲 flavor 。

上面這段話來自於官方文檔,感受聽不懂也不要緊,下面咱們將舉幾個栗子來剖析他。

3.1 PurePath.match

下面讓咱們來實現一個神奇的功能,判斷下當前的路徑是否有符合'*.py'規則的文件。

# python語言實現

# /Users/mac/test.py
import pathlib

print(pathlib.PurePath(__file__).match('*.py'))  # True

輸出爲何會是 True 呢?由於當前文件夾下不就有一個 test.py 嗎?

3.2 PurePosixPath

看見 pathlib.PurePath 後面跟着 match,那是否是能說明他是個對象,而不是一個單純的路徑字符串,所以咱們能夠試着打印 pathlib.PurePath 看一看。

# python語言實現

# /Users/mac/test.py
import pathlib

os_path = os.path.dirname(__file__)
print(os_path)  # /Users/mac/

pure_path = pathlib.PurePath(__file__)
print(pure_path)  # /Users/mac/test.py <class 'pathlib.PurePosixPath'>

print(pathlib.PurePath(__file__).match('*.py'))  # True

經過打印 os.path 獲取當前路徑的結果,獲得一個路徑字符串;而經過 pathlib.PurePath 則得到了一個 PurePosixPath 對象,而且由此獲得的路徑包括了當前文件 test.py。

那麼問題來了,PurePosixPath到底是什麼玩意呢?能不能像機器貓的記憶麪包同樣幫助我速成英語。下面不得不又一次展現咱們這個官方文檔了:

pathlib 能夠操做兩種文件系統的路徑,一種是 Windows 文件系統,另外一種稱爲非 Windows 文件系統,對應的對象是 pathlib.PurePosixPath 和 pathlib.PureWindowsPath,不過不用擔憂,這些類並不是是指定在某些操做系統上運行纔可以使用,不管你運行的是哪一個系統,均可以實例化全部這些類,由於它們不提供任何進行系統調用的操做。

這講的都是啥呀?不提供任何進行系統調用的操做,納尼???/腦補黑人臉

爲了完全的瞭解他,不得不放出真正的大招了,也就是咱們官方文檔在最開始的時候提供的這一段描述和一張圖:

Pure paths are useful in some special cases; for example:
If you want to manipulate Windows paths on a Unix machine (or vice versa). You cannot instantiate a WindowsPath when running on Unix, but you can instantiate PureWindowsPath.
You want to make sure that your code only manipulates paths without actually accessing the OS. In this case, instantiating one of the pure classes may be useful since those simply don’t have any OS-accessing operations.

翻譯:純路徑在某些特殊狀況下頗有用;例如:若是要在Unix計算機上操做Windows路徑(反之亦然)。WindowsPath在Unix上運行時沒法實例化,但能夠實例化PureWindowsPath。
您但願確保您的代碼僅操做路徑而不實際訪問操做系統。在這種狀況下,實例化其中一個純類可能頗有用,由於那些只是沒有任何操做系統訪問操做。

這張圖看起來如此簡潔,可是他的複雜程度不亞於清明上河圖呀!也許朝着這張圖片灑點水(請勿輕易嘗試,珍惜你的女友——電腦)才能得知真相吧?但真相其實就藏在接下來的描述當中。

4、os和pathlib的對應關係

少俠,上幾節中老夫已經將畢生所學教給你了,將來只能靠你本身去參考這份武林祕籍——九陰真經,他詳盡的描述了 os 模塊和 pathlib 庫的對應關係,若是忘了,別忘了多回家看看。

5、pathlib祕籍

5.1 基本用法

# python語言實現

Path.iterdir()  # 遍歷目錄的子目錄或者文件

Path.is_dir()  # 判斷是不是目錄

Path.glob()  # 過濾目錄(返回生成器)

Path.resolve()  # 返回絕對路徑

Path.exists()  # 判斷路徑是否存在

Path.open()  # 打開文件(支持with)

Path.unlink()  # 刪除文件或目錄(目錄非空觸發異常)

5.2 基本屬性

# python語言實現

Path.parts  # 分割路徑 相似os.path.split(), 不過返回元組

Path.drive  # 返回驅動器名稱

Path.root  # 返回路徑的根目錄

Path.anchor  # 自動判斷返回drive或root

Path.parents  # 返回全部上級目錄的列表

5.3 改變路徑

# python語言實現

Path.with_name()  # 更改路徑名稱, 更改最後一級路徑名

Path.with_suffix()  # 更改路徑後綴

5.4 拼接路徑

# python語言實現

Path.joinpath()  # 拼接路徑

Path.relative_to()  # 計算相對路徑

5.5 測試路徑

# python語言實現

Path.match()  # 測試路徑是否符合pattern

Path.is_dir()  # 是不是文件

Path.is_absolute()  # 是不是絕對路徑

Path.is_reserved()  # 是不是預留路徑

Path.exists()  # 判斷路徑是否真實存在

5.6 其餘方法

# python語言實現

Path.cwd()  # 返回當前目錄的路徑對象

Path.home()  # 返回當前用戶的home路徑對象

Path.stat()  # 返回路徑信息, 同os.stat()

Path.chmod()  # 更改路徑權限, 相似os.chmod()

Path.expanduser()  # 展開~返回完整路徑對象

Path.mkdir()  # 建立目錄

Path.rename()  # 重命名路徑

Path.rglob()  # 遞歸遍歷全部子目錄的文件

6、pathlib回顧

經過上面的幾個例子,咱們對 pathlib 應該有一個大致的瞭解,接下來再回顧一下官方給 pathlib 庫的定義:

This module offers classes representing filesystem paths with semantics appropriate for different operating systems. Path classes are divided between pure paths, which provide purely computational operations without I/O, and concrete paths, which inherit from pure paths but also provide I/O operations.

釋義:pathlib 提供表示文件系統路徑的類,其語義適用於不一樣的操做系統。路徑類在純路徑之間劃分,純路徑提供純粹的計算操做而沒有I / O,以及具體路徑,它繼承純路徑但也提供I / O操做。

回顧上一章清明上河圖:

若是你之前從未使用過這個模塊,或者只是不肯定哪一個類適合您的任務,那麼 Path 極可能就是您所須要的。他會爲代碼運行的不一樣的系統實例化屬於該系統的具體路徑,而不須要你本身設定。

7、總結

pathlib 不是單純的對 os 中的一些方法進行封裝,而是爲了兼容不一樣的操做系統而生。他爲每類操做系統定義了接口,也就是說你但願在UNIX系統上操做Windows系統的路徑,直接操做是不可能的,因此他爲你建立了一套接口 PurePath,你能夠經過接口來實現你的目的(反之亦然)。

相關文章
相關標籤/搜索