溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

python3怎么利用pathlib替代os.path

發(fā)布時間:2022-04-18 10:30:36 來源:億速云 閱讀:176 作者:iii 欄目:開發(fā)技術(shù)

這篇文章主要介紹“python3怎么利用pathlib替代os.path”,在日常操作中,相信很多人在python3怎么利用pathlib替代os.path問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”python3怎么利用pathlib替代os.path”的疑惑有所幫助!接下來,請跟著小編一起來學(xué)習(xí)吧!

    前言

    如果你還在為操作文件路徑煩惱,不會使用os.path模塊,那么是時候試試pathlib了。

    pathlib 庫

    pathlib 庫從 python3.4 開始,到 python3.6 已經(jīng)比較成熟。如果你的新項目可以直接用 3.6 以上,建議用 pathlib。相比于老式的 os.path 有幾個優(yōu)勢:

    • 老的路徑操作函數(shù)管理比較混亂,有的是導(dǎo)入 os, 有的又是在 os.path 當(dāng)中,而新的用法統(tǒng)一可以用 pathlib 管理。

    • 老用法在處理不同操作系統(tǒng) win,mac 以及 linux 之間很吃力。換了操作系統(tǒng)常常要改代碼,還經(jīng)常需要進行一些額外操作。

    • 老用法主要是函數(shù)形式,返回的數(shù)據(jù)類型通常是字符串。但是路徑和字符串并不等價,所以在使用 os 操作路徑的時候常常還要引入其他類庫協(xié)助操作。新用法是面向?qū)ο?,處理起來更靈活方便。

    • pathlib 簡化了很多操作,用起來更輕松。

    常用的 pathlib 和 os 對比圖

    操作os and os.pathpathlib
    絕對路徑os.path.abspathPath.resolve
    修改權(quán)限os.chmodPath.chmod
    創(chuàng)建目錄os.mkdirPath.mkdir
    重命名os.renamePath.rename
    移動os.replacePath.replace
    刪除目錄os.rmdirPath.rmdir
    刪除文件os.remove, os.unlinkPath.unlink
    工作目錄os.getcwdPath.cwd
    是否存在os.path.existsPath.exists
    用戶目錄os.path.expanduserPath.expanduser and Path.home
    是否為目錄os.path.isdirPath.is_dir
    是否為文件os.path.isfilePath.is_file
    是否為連接os.path.islinkPath.is_symlink
    文件屬性os.statPath.stat, Path.owner, Path.group
    是否為絕對路徑os.path.isabsPurePath.is_absolute
    路徑拼接os.path.joinPurePath.joinpath
    文件名os.path.basenamePurePath.name
    上級目錄os.path.dirnamePurePath.parent
    同名文件os.path.samefilePath.samefile
    后綴os.path.splitextPurePath.suffix

    pathlib 獲取文件路徑

    Path.cwd 獲取當(dāng)前文件夾路徑

    需注意的是,返回的不是字符串,而是 WindowsPath 對象

    from pathlib import Path
    
    # 1.可以直接調(diào)用類方法.cwd()
    print(Path.cwd())  # C:\Users\dell\PycharmProjects\untitled3\demo
    
    # 2.也可以實例化后調(diào)用
    p = Path('./')
    print(p.cwd()) # C:\Users\dell\PycharmProjects\untitled3\demo
    print(type(p.cwd()))  # <class 'pathlib.WindowsPath'>

    獲取當(dāng)前文件路徑

    from pathlib import Path
    
    # 當(dāng)前文件路徑
    p = Path(__file__)
    print(p)

    獲取 Path 對象絕對路徑

    from pathlib import Path
    
    # 當(dāng)前文件路徑
    p = Path('data.json')
    print(p)  # data.json 對象
    print(p.absolute())  # C:\Users\dell\PycharmProjects\untitled3\demo\data.json

    一些常用的獲取文件屬性

    from pathlib import Path
    
    # 當(dāng)前文件路徑
    p = Path(__file__)
    print(p.absolute())   # 獲取絕對路徑
    print(p.resolve())    # 獲取絕對路徑
    print(p.name)   # 獲取文件名稱 'a1117.py'
    print(p.stem)    # 只要文件名,不要后綴 a1117
    print(p.suffix)  # 獲取文件 后綴.py
    print(p.suffixes)  # 文件所有的猴子 ['.py']
    print(p.parts)  # 拆分('C:\\', 'Users', 'dell', 'PycharmProjects', 'untitled3', 'demo', 'a1117.py')
    print(p.parent)  # C:\Users\dell\PycharmProjects\untitled3\demo
    print(p.parent.parent)  # C:\Users\dell\PycharmProjects\untitled3
    print(p.parents)  # 所有的父級 <WindowsPath.parents>
    print(p.anchor)  # 錨,目錄前面的部分 C:\ 或者 /

    獲取上層,上上層目錄

    from pathlib import Path
    
    # .parent 獲取上一層
    print(Path.cwd().parent)
    
    # 實例化后調(diào)用 .parent
    p = Path('./')
    print(p.cwd().parent)

    獲取上上層使用鏈?zhǔn)椒椒ㄕ{(diào)用 .parent.parent

    from pathlib import Path
    
    # .parent 獲取上一層
    print(Path.cwd().parent.parent)
    
    # 實例化后調(diào)用 .parent
    p = Path('./')
    print(p.cwd().parent.parent)

    獲取用戶home目錄

    from pathlib import Path
    print(Path.home())  # c:\Users\dell

    判斷文件,文件夾

    is_file()判斷是不是文件

    from pathlib import Path
    
    # 1.  is_file() 判斷是不是文件
    print(Path.cwd().is_file())  # False
    
    # 2.也可以實例化后調(diào)用
    p = Path('./data.json')
    print(p.is_file())  # True

    is_dir() 判斷是否是文件夾

    from pathlib import Path
    
    # 1.  is_file() 判斷是不是文件
    print(Path.cwd().is_dir())  # True
    
    # 2.也可以實例化后調(diào)用
    p = Path('./data.json')
    print(p.is_dir())  # False

    exists() 判斷文件 或文件夾是否存在

    from pathlib import Path
    
    # exists() 判斷是否存在
    p = Path('./data.json')
    print(p.exists())  # True or False

    is_absolute() 判斷是否是絕對路徑

    from pathlib import Path
    
    # 當(dāng)前文件路徑
    p = Path(__file__)
    print(p)
    print(p.is_absolute())  # True

    joinpath 拼接目錄

    可以用類似 os.path.join 的方法

    from pathlib import Path
    
    # 當(dāng)前文件路徑
    p = Path('./')
    print(p.absolute())  # C:\Users\dell\PycharmProjects\untitled3\demo
    print(p.joinpath('data.json'))  # data.json
    print(p.joinpath('data.json').absolute())   # C:\Users\dell\PycharmProjects\untitled3\demo\data.json
    # 拼接多層
    print(p.joinpath('files', 'data.json'))   # files\data.json
    print(p.joinpath('files', 'data.json').absolute())  # C:\Users\dell\PycharmProjects\untitled3\demo\files\data.json

    pathlib 支持用 / 拼接路徑, 這種語法估計用的人很少

    from pathlib import Path
    
    # 當(dāng)前文件路徑
    p = Path('./')
    # / 拼接
    new_path = p / 'files' / 'data.json'
    print(new_path.absolute())

    iterdir()遍歷文件目錄

    比如在當(dāng)前腳本的 files 目錄有以下文件夾和子文件

    python3怎么利用pathlib替代os.path

    .iterdir() 遍歷某個目錄下的所有路徑(文件和子目錄)

    from pathlib import Path
    
    # 當(dāng)前文件路徑
    p = Path('files')
    for i in p.iterdir():
        print(i.absolute())
    
    """運行結(jié)果:
    C:\Users\dell\PycharmProjects\untitled3\demo\files\json
    C:\Users\dell\PycharmProjects\untitled3\demo\files\username.txt
    C:\Users\dell\PycharmProjects\untitled3\demo\files\yaml
    """

    如果只需獲取文件夾,可以加個判斷.is_dir()

    from pathlib import Path
    
    # 當(dāng)前文件路徑
    p = Path('files')
    print([i for i in p.iterdir() if i.is_dir()])  # [WindowsPath('files/json'), WindowsPath('files/yaml')]

    也可以用.is_file獲取文件對象

    from pathlib import Path
    
    # 當(dāng)前文件路徑
    p = Path('files')
    print([i for i in p.iterdir() if i.is_file()])  # [WindowsPath('files/username.txt')]

    glob() 和 rglob() 模式匹配(正則表達式)

    使用模式匹配(正則表達式)匹配指定的路徑。glob 只會匹配當(dāng)前目錄下, rglob 會遞歸所有子目錄 比如在當(dāng)前腳本的 files 目錄有以下文件夾和子文件

    python3怎么利用pathlib替代os.path

    glob 只會匹配當(dāng)前目錄下

    from pathlib import Path
    
    p = Path('files')
    # glob 只會遍歷查找當(dāng)前目錄
    print(p.glob('*.txt'))  # <generator object Path.glob at 0x000001A44565A518>
    print([i for i in p.glob('*.txt')])  # [WindowsPath('files/username.txt')]
    print([i for i in p.glob('*.yml')])  # []

    rglob 會遞歸所有子目錄

    from pathlib import Path
    
    p = Path('files')
    # glob 只會遍歷查找當(dāng)前目錄
    print(p.rglob('*.txt'))  # <generator object Path.glob at 0x000001A44565A518>
    print([i for i in p.rglob('*.txt')])  # [WindowsPath('files/username.txt')]
    print([i for i in p.rglob('*.yml')])  # [WindowsPath('files/yaml/aa.yml'), WindowsPath('files/yaml/bb.yml')]

    match() 檢查路徑是否符合規(guī)則

    from pathlib import Path
    
    p = Path('data.json')
    # math 檢查匹配規(guī)則
    print(p.match('*.json'))  # True

    創(chuàng)建文件操作

    touch() 創(chuàng)建文件

    from pathlib import Path
    
    p = Path('xx.json')
    p.touch()   # 創(chuàng)建一個xx.json

    當(dāng)文件已經(jīng)存在的時候,p.touch() 也不會報錯,因為默認參數(shù) exist_ok=True 如果設(shè)置 exist_ok=False, 文件已經(jīng)存在,touch就會報錯了

    from pathlib import Path
    
    p = Path('xx.json')
    p.touch(exist_ok=False)   # 創(chuàng)建一個xx.json

    拋出異常FileExistsError: [Errno 17] File exists: 'xx.json'

    mkdir() 創(chuàng)建目錄

    在當(dāng)前腳本下創(chuàng)建一個yoyo目錄

    from pathlib import Path
    
    p = Path('yoyo')
    # mkdir 創(chuàng)建yoyo目錄
    p.mkdir()

    如果想一次性創(chuàng)建多層目錄 'yoyo/json'

    from pathlib import Path
    
    p = Path('yoyo/json')
    # mkdir 創(chuàng)建yoyo/json目錄
    p.mkdir()

    此時會拋出異常FileNotFoundError: [WinError 3] 系統(tǒng)找不到指定的路徑。: 'yoyo\json'

    遞歸創(chuàng)建目錄mkdir(parents=True)

    from pathlib import Path
    
    p = Path('yoyo/json')
    # mkdir 創(chuàng)建yoyo/json目錄
    p.mkdir(parents=True)

    刪除文件操作

    刪除目錄非常危險,并且沒有提示,一定要謹慎操作

    rmdir() 一次只刪除一級目錄,且當(dāng)前目錄必須為空。

    from pathlib import Path
    
    p = Path('yoyo/json')
    # mkdir 創(chuàng)建yoyo/json目錄
    p.rmdir()

    unlink() 刪除文件

    from pathlib import Path
    
    p = Path('files/username.txt')
    p.unlink()

    文件讀寫操作

    pathlib 對讀取和寫入進行了簡單的封裝,不再需要重復(fù)去打開文件和管理文件的關(guān)閉了。

    • .read_text() 讀取文本

    • .read_bytes() 讀取 bytes

    • .write_text() 寫入文本

    • .write_bytes() 寫入 tytes

    from pathlib import Path
    
    p = Path('yo.txt')
    p.write_text("hello world")
    print(p.read_text())  # hello world

    file.write 操作使用的是 w 模式,如果之前已經(jīng)有文件內(nèi)容,將會被覆蓋。

    修改文件

    replace() 移動文件

    from pathlib import Path
    
    p = Path('yo.txt')
    p.write_text("hello world")
    print(p.read_text())  # hello world
    
    p.replace('xx.json')

    with_name() 重命名文件

    from pathlib import Path
    
    p = Path('hello.txt')
    p.write_text("hello world")
    print(p.read_text())  # hello world
    
    # 重命名為一個新的文件對象
    new_file = p.with_name('x.txt')
    print(new_file)
    p.replace(new_file)  # 移動到新的位置

    到此,關(guān)于“python3怎么利用pathlib替代os.path”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識,請繼續(xù)關(guān)注億速云網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>

    向AI問一下細節(jié)

    免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

    AI