當前位置: 妍妍網 > 辦公

pathlib:一個比os更優雅的路徑操作模組

2024-03-22辦公

對於 Python 中的路徑操作,大多數人第一反應肯定是 os,可以說 os 已經在老一輩 Python coder 心中紮深蒂固,現存的很多教程中操作路徑仍然使用 os,殊不知從 python3.4 開始,pathlib 正式成為標準庫,已經能夠完全取代 os。 無論從功能還是易用性都已經超越 os。

看個經典的例子,我們分別使用 os 與 pathlib 來獲取上層目錄和上上層目錄。

os 方法

import os.path
# 獲取上層目錄
os.path.dirname(os.getcwd())
# 獲取上上層目錄
os.path.dirname(os.path.dirname(os.getcwd()))

pathlib 方法

from pathlib import Path
# 獲取上層目錄
Path.cwd().parent
# 獲取上上層目錄
Path.cwd().parent.parent

[鏈式呼叫]完敗[巢狀呼叫] ,pathlib 是物件導向的模組,使用起來非常靈活方便,下面就詳細看看 pathlib 常見操作。 建議大家收藏備用!

  • 安裝 pathlib 模組

  • pathlib常見操作

  • 獲取絕對路徑

  • 建立檔/目錄

  • 檔/目錄判斷

  • 路徑拼接/拆分

  • 獲取檔/目錄資訊

  • 遍歷目錄

  • 重新命名/移動檔

  • 刪除檔/目錄

  • 安裝 pathlib 模組

    透過命令列直接安裝。

    pip install pathlib

    也可以使用豆瓣映像安裝。

    pip install -i https://pypi.douban.com/simple pathlib

    執行上述命令後,可以檢查一下是否安裝成功。

    pip show pathlib

    pathlib常見操作

    獲取絕對路徑

    獲取當前絕對路徑,兩種方法。

    >>> Path().cwd()
    WindowsPath('E:/material/pathlib用法')
    >>> Path().resolve()
    WindowsPath('E:/material/pathlib用法')

    建立檔/目錄

    建立目錄時要註意兩個參數:

  • parents :預設為 False,如果父目錄不存在,會丟擲異常,True 則建立這些目錄。

  • exist_ok :預設為 False,目錄已存在時會丟擲異常。

  • 這裏我們在 material 目錄下建立 test 資料夾。

    >>> p = Path(r'E:\material\test')
    >>> p.mkdir(parents=True, exist_ok=True)

    touch() 用於建立空檔,父級目錄必須存在,否則丟擲異常。

    >>> p = Path('E:/material/test1.txt')
    >>> p.touch(exist_ok=True)

    檔/目錄判斷

    判斷是否為資料夾

    >>> Path('E:/material/pathlib用法').is_dir()
    True

    判斷是否為檔

    >>> Path('E:/material/pathlib用法/txt檔.txt').is_file()
    True

    判斷路徑是否存在

    >>> Path('E:/material/error.txt').exists()
    False

    路徑拼接/拆分

    Path類路徑拼接的兩種方法。

    >>> Path('E:/material''pathlib用法')
    WindowsPath('E:/material/pathlib用法')
    >>> Path.cwd().parent.joinpath('pathlib用法')
    WindowsPath('E:/material/pathlib用法')

    使用 '/' 進行路徑拼接。

  • Path Object / Path Object

  • str / Path Object

  • Path Object / str

  • >>> Path('E:/') / Path('/material/')
    WindowsPath('E:/material')
    >>> 'E:/' / Path('/material/')
    WindowsPath('E:/material')
    >>> Path('E:/') / '/material/'
    WindowsPath('E:/material')

    按照分隔符將檔路徑分割

    >>> p.parts
    ('E:\\''material''pathlib用法')

    獲取檔/目錄資訊

    獲取檔/目錄名。

    >>> p = Path('E:/material/pathlib用法/excel檔.xlsx')
    >>> p.name
    'excel檔.xlsx'

    獲取不包含字尾的檔名。

    >>> p.stem
    'excel檔'

    獲取檔字尾名。

    >>> p.suffix
    '.xlsx'

    獲取錨,最前面的部份 E:\

    >>> p.anchor
    'E:\\'

    獲取上層目錄路徑

    >>> p = path.cwd()
    >>> p.parent
    WindowsPath('E:/material')

    獲取所有上層目錄路徑

    >>> [path for path in p.parents]
    [WindowsPath('E:/material'), WindowsPath('E:/')]

    獲取檔/目錄內容。

    >>> p.stat()
    os.stat_result(st_mode=33206, st_ino=562949953976250, st_dev=503425376, st_nlink=1, st_uid=0, st_gid=0, st_size=6611, st_atime=1642130252, st_mtime=1642062067, st_ctime=1642066962)

    獲取檔/目錄大小,單位字節(B)

    >>> p.stat().st_size
    6611

    獲取檔/目錄修改時間。

    >>> p.stat().st_mtime
    1642062067.4264374

    獲取檔/目錄建立時間。

    >>> p.stat().st_ctime
    1642066962.072431

    上面獲取的時間都是時間戳,透過 datetime 模組轉成標準日期格式。

    >>> from datetime import datetime
    >>> date = datetime.utcfromtimestamp(p.stat().st_ctime)
    >>> date.strftime("%Y-%m-%d %H:%M:%S")
    '2022-01-13 09:42:42'

    遍歷目錄

    範例資料夾

    ┌ .ipynb_checkpoints
    ├ └ Pathlib用法-checkpoint.ipynb
    ├ csv檔.csv
    ├ excel檔.xlsx
    ├ Pathlib用法.ipynb
    ├ py檔.py
    └ txt檔.txt

    遍歷目錄下所有檔,返回一個包含結果路徑的叠代器。

    >>> p = Path.cwd()
    >>> [path for path in p.iterdir()]
    [WindowsPath('E:/material/pathlib用法/.ipynb_checkpoints'),
     WindowsPath('E:/material/pathlib用法/csv檔.csv'),
     WindowsPath('E:/material/pathlib用法/excel檔.xlsx'),
     WindowsPath('E:/material/pathlib用法/Pathlib用法.ipynb'),
     WindowsPath('E:/material/pathlib用法/py檔.py'),
     WindowsPath('E:/material/pathlib用法/txt檔.txt')]

    根據指定正則匹配目錄下的檔, 不匹配 子目錄內的檔。

    >>> [path for path in p.glob('*.txt')]
    [WindowsPath('E:/material/pathlib用法/txt檔.txt')]

    根據指定正則匹配目錄下的檔, 匹配 子目錄內的檔。

    >>> [path for path in p.rglob('*.ipynb')]
    [WindowsPath('E:/material/pathlib用法/Pathlib用法.ipynb'),
     WindowsPath('E:/material/pathlib用法/.ipynb_checkpoints/Pathlib用法-checkpoint.ipynb')]

    重新命名/移動檔

    rename()

    重新命名檔,當新命名的檔重復時,會丟擲異常。下面我們將 test1.txt 檔先重新命名為 test2.txt ,再修改字尾名為 test2.json

    >>> p = Path('E:/material/test1.txt')
    >>> new_name = p.with_name('test2.txt')
    >>> p.rename(new_name)
    WindowsPath('E:/material/test2.txt')
    >>> new_suffix = new_name.with_suffix('.json')
    >>> new_name.rename(new_suffix)
    WindowsPath('E:/material/test2.json')

    移動檔,當新路徑下檔已存在時,無法建立該檔。

    >>> p = Path('E:/material/test2.txt')
    >>> p.rename('E:/material/pathlib用法/test3.txt')
    WindowsPath('E:/material/pathlib用法/test3.txt')

    replace()

    replace() rename() 用法基本相同,唯一不同點就是當新命名的檔重復時, replace() 不會丟擲異常,而是直接覆蓋舊檔。

    刪除檔/目錄

    刪除檔, missing_ok=True 設定檔不存在不會丟擲異常。

    >>> p = Path('E:/material/pathlib用法/not_exist.txt')
    >>> p.unlink(missing_ok=True)

    刪除目錄,目錄必須為空,否則丟擲異常。

    >>> p = Path('E:/material/pathlib用法/test')
    >>> p.rmdir()

    以上就是 pathlib 常見操作,足以解決日常工作中的絕大多數問題, 收藏,點贊,轉發 支持一下吧!

    作者: Python丁小傑

    來源 :Python新視野

    Crossin的新書【 碼上行動:用ChatGPT學會Python編程 】已經上市了。 本書以ChatGPT為輔助,系統全面地講解了如何掌握Python編程,適合Python零基礎入門的讀者學習。

    購買後可加入讀者交流群,Crossin為你開啟陪讀模式,解答你在閱讀本書時的一切疑問。

    Crossin的其他書籍:

    添加微信 crossin123 ,加入編程教室共同學習 ~

    感謝 轉發 點贊 的各位~