pathlib的使用


 轉載自公眾號:進擊的Coder,作者:韋世東

一、介紹

pathlib 是Python內置庫,Python 文檔給它的定義是 Object-oriented filesystem paths(面向對象的文件系統路徑)。pathlib 提供表示文件系統路徑的類,其語義適用於不同的操作系統。路徑類在純路徑之間划分,純路徑提供純粹的計算操作而沒有I / O,以及具體路徑,它繼承純路徑但也提供I / O操作。
pathlib中的Path類可以創建path路徑對象, 屬於比os.path更高抽象級別的對象。


純路徑在某些特殊情況下很有用,例如:
如果要在Unix計算機上操作Windows路徑(反之亦然)。WindowsPath在Unix上運行時無法實例化,但可以實例化PureWindowsPath(純路徑)

你希望確保你的代碼僅在不實際訪問操作系統的情況下操作路徑。在這種情況下,實例化其中一個純類可能很有用,因為那些只是沒有任何操作系統訪問操作。

 

 

二、初步使用

1、os模塊獲取當前文件路徑

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

使用 os 模塊時,有兩種方法可以直接獲取當前文件路徑

import os


v1 = os.path.dirname(__file__)
v2 = os.getcwd()
print(v1)  # D:/Projects/Test
print(v2)  # D:\Projects\Test

 

2、pathlib 獲取當前文件路徑

官方文檔建議

import pathlib
v = pathlib.Path.cwd()
print(v)  # D:\Projects\Test

 

它是如何實現的?文檔中有介紹,它以 os.getcwd() 的形式將路徑返回。

@classmethod
def cwd(cls):
    """Return a new path pointing to the current working directory
    (as returned by os.getcwd()).
    """
    return cls(os.getcwd())

原來它是對 os 模塊中一些對象進行了封裝,看 cwd 的注釋:
Return a new path pointing to the current working directory  
意為:返回指向當前工作目錄的新路徑。

看起來也沒什么特別的,但是為什么官方特意將它推出呢?

其實 pathlib 封裝了很多的 os path ,文檔中有寫明,如:

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

 os.path.expanduser() --> pathlib.Path.expanduser()

 os.stat() --> pathlib.Path.stat()

 os.chmod() --> pathlib.Path.chmod()

但是上面的案例並不能說明什么,只是讓我們了解到 pathlib 的構成,接下來讓我們感受一下它帶給我們的便捷。

 

三、pathlib 的便捷操作

1、獲取上層/上層目錄

也就是獲取它爺爺的名字

 

1.os 模塊的寫法

import os

print(os.path.dirname(os.path.dirname(os.getcwd())))  # D:\

 

2.pathlib的寫法

import pathlib

print(pathlib.Path.cwd().parent.parent)  # D:\

 

parent 就完事了,這是不是更貼近 Pythonic ?像寫英語一樣寫代碼

如果你只需要找到它爸爸,那就使用一次

import pathlib

print(pathlib.Path.cwd().parent)

 

你還可以繼續往祖輩上找

import pathlib

print(pathlib.Path.cwd().parent.parent.parent)

 

相對與之前 os 模塊使用的多層 os.path.dirname,使用 parent 顯然便捷很多

 

2、路徑拼接

1.os的拼接方式

如果你要在它爺爺輩那里拼接路徑,那么你需要寫這么長一串代碼

import os

v = os.path.join(os.path.dirname(os.path.dirname(os.getcwd())), "Hello", "World")
print(v)  # D:\Hello\World

 

2.用 pathlib 拼接

import pathlib

parts = ["Hello", "World"]
v = pathlib.Path.cwd().parent.parent.joinpath(*parts)
print(v)  # D:\Hello\World

而且你還可以通過增加或減少 parent 的數量,來實現它祖輩的調節,美哉。

 

四、pathlib的其他用法

上面的操作大部分都通過 pathlib 中的 Path 實現,其實它還有另一個模塊 PurePath。

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

 

1、PurePath.match

讓我們來判斷一下,當前文件路徑是否有符合 '*.py' 規則的文件

import pathlib

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

深入想一下 pathlib.PurePath 后面能夠跟着 match,那說明它應該是個對象,而不是一個路徑字符串。

為了驗證這個想法,把代碼改一改:

import pathlib
import os


os_path = os.path.dirname(__file__)
pure_path = pathlib.PurePath(__file__)
print(os_path, type(os_path))  # D:\Projects\Test <class 'str'>
print(pure_path, type(pure_path))  # D:\Projects\Test\test.py <class 'pathlib.PureWindowsPath'>
print(pathlib.PurePath(__file__).match('*.py'))  # True

打印通過 os.path 獲取當前路徑的結果,得出一個路徑字符串;而通過 pathlib.Pure 則獲得的是一個PureWindowsPath 對象,並且得到的路徑包括了當前文件 test.py(我當前就是使用test.py寫着這段測試的代碼)。

 

這就有點懸疑了, PureWindowsPath 和 PurePosixPath 究竟是什么?

pathlib 可以操作兩種文件系統的路徑,一種是 Windows 文件系統,另一種稱為非 Windows 文件系統,對應的對象是 PureWindowsPath 和 PurePosixPath ,不過不用擔心,這些類並非是指定在某些操作系統上運行才能夠使用,無論你運行的是哪個系統,都可以實例化所有這些類,因為它們不提供任何進行系統調用的操作。

不提供任何進行系統調用的操作,這又是什么?真是越聽越深了

文檔在最開始給出了這么一段描述:

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。
您希望確保您的代碼僅操作路徑而不實際訪問操作系統。在這種情況下,實例化其中一個純類可能很有用,因為那些只是沒有任何操作系統訪問操作。

 

官方給 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操作。

pathlib 不單純是對 os  中一些模塊或方法進行封裝,而是為了兼容不同的操作系統,它為每類操作系統定義了接口。你希望在UNIX機器上操作Windows的路徑,然而直接操作是做不到的,所以為你創建了一套接口 PurePath,你可以通過接口來實現你的目的(反之亦然)

 

2、對應關系

通過以上的例子我們可以感受到,它不僅封裝了 os.path 相關常用方法,還集成了 os 的其他模塊,比如創建文件夾 Path.mkdir。

如果你擔心記不住,沒關系的,文檔一直都在。並且文檔給我們列出了對應關系表

 

3、基本用法

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

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

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

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

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

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

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

 

4、基本屬性

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

Path.drive  # 返回驅動器名稱

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

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

Path.parents  # 返回所有上級目錄的列表

 

5、改變路徑

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

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

 

6、拼接路徑

Path.joinpath()  # 拼接路徑

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

 

7、測試路徑

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

Path.is_dir()  # 是否是文件

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

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

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

 

8、其他方法

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

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

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

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

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

Path.mkdir()  # 創建目錄

Path.rename()  # 重命名路徑

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM