Python:pathlib模組

不羈的羅恩發表於2022-02-18

Blog:部落格園 個人

關於panthlib模組

pathlib模組提供表示檔案系統路徑的類,其語義適用於不同的作業系統。路徑類被分為提供純計算操作而沒有 I/O 的純路徑,以及從純路徑繼承而來但提供 I/O 操作的具體路徑。

pathlib-inheritance

以下是一個對映了 os PurePath/Path 對應相同的函式的表。

?注意:儘管 os.path.relpath()PurePath.relative_to() 擁有相同的重疊的用例,但是它們語義相差很大,不能認為它們等價。

os 和 os.path pathlib
os.path.abspath() Path.resolve()
os.chmod() Path.chmod()
os.mkdir() Path.mkdir()
os.makedirs() Path.mkdir()
os.rename() Path.rename()
os.replace() Path.replace()
os.rmdir() Path.rmdir()
os.remove(), os.unlink() Path.unlink()
os.getcwd() Path.cwd()
os.path.exists() Path.exists()
os.path.expanduser() Path.expanduser()Path.home()
os.listdir() Path.iterdir()
os.path.isdir() Path.is_dir()
os.path.isfile() Path.is_file()
os.path.islink() Path.is_symlink()
os.link() Path.link_to()
os.symlink() Path.symlink_to()
os.readlink() Path.readlink()
os.stat() Path.stat(), Path.owner(), Path.group()
os.path.isabs() PurePath.is_absolute()
os.path.join() PurePath.joinpath()
os.path.basename() PurePath.name
os.path.dirname() PurePath.parent
os.path.samefile() Path.samefile()
os.path.splitext() PurePath.suffix

?Tips:os模組的寫法是函式式的,由內到外需要一層一層剝開,而pathlib模組是鏈式寫法,從左到右理解,相較於從內到外理解更加清晰。

基礎使用

列出子目錄

>>> from pathlib import Path  # 匯入模組
>>> p = Path('.')
>>> [x for x in p.iterdir() if x.is_dir()]
[PosixPath('.pip'), PosixPath('.pki'), PosixPath('.ansible'), PosixPath('.ssh'), PosixPath('.cache')]

查詢路徑屬性

>>> p = Path('.')
>>> p.exists()  # 判斷是否存在
True
>>> p.is_dir()  # 判斷是否為資料夾
True
>>> p.is_file()  # 判斷是否為檔案
False
>>> p.is_absolute()  # 判斷是否為絕對路徑
False

>>> path = Path('/tmp/aaa.txt')
>>> path.name  # 獲取檔名
'aaa.txt'
>>> path.stem   # 獲取檔名,不帶字尾
'aaa'
>>> path.suffix  # 獲取檔案字尾
'.txt'
>>> path.parent  # 獲取上級目錄
PosixPath('/tmp')
>>> path.root   # 獲取根路徑
'/'
>>> path.parts  # 將路徑分割成元祖
('/', 'tmp', 'aaa.txt')
>>> path.stat()  # 獲取檔案資訊
os.stat_result(st_mode=33188, st_ino=134896383, st_dev=64768, st_nlink=1, st_uid=0, st_gid=0, st_size=4, st_atime=1645078071, st_mtime=1645078071, st_ctime=1645078071)
>>> path.resolve()  # 獲取絕對路徑
PosixPath('/tmp/aaa.txt')
>>> path.cwd()   # 獲取當前路徑
PosixPath('/tmp')
>>> path.home()  # 獲取家目錄
PosixPath('/root')

檔案修改

targetstring時,重新命名檔案或資料夾;當targetPath時,重新命名並移動檔案或資料夾。

path.rename(target)

重新命名當前檔案或資料夾,如果target所指示的檔案或資料夾已存在,則覆蓋原檔案。

path.replace(target)

path為空資料夾的時候,刪除該資料夾

>>> path = Path('/tmp/aaa')
>>> path.exists()
True
>>> path.rmdir()
>>> path.exists()
False

刪除檔案或目錄,目錄非空觸發異常。

>>> path = Path('/tmp/bbb')
>>> path.unlink()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/python3/lib/python3.8/pathlib.py", line 1324, in unlink
    self._accessor.unlink(self)
IsADirectoryError: [Errno 21] Is a directory: '/tmp/bbb'

根據路徑建立資料夾,parents=True時,會依次建立路徑中間缺少的資料夾。

>>> path = Path('/tmp/aaa/bbb/ccc')
>>> path.mkdir()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/python3/lib/python3.8/pathlib.py", line 1287, in mkdir
    self._accessor.mkdir(self, mode)
FileNotFoundError: [Errno 2] No such file or directory: '/tmp/aaa/bbb/ccc'
>>> path.mkdir(parents=True)

相關文章