首頁 > 軟體

python3利用pathlib替代os.path的方法範例

2022-04-17 13:00:52

前言

如果你還在為操作檔案路徑煩惱,不會使用os.path模組,那麼是時候試試pathlib了。

pathlib 庫

pathlib 庫從 python3.4 開始,到 python3.6 已經比較成熟。如果你的新專案可以直接用 3.6 以上,建議用 pathlib。相比於老式的 os.path 有幾個優勢:

  • 老的路徑操作函數管理比較混亂,有的是匯入 os, 有的又是在 os.path 當中,而新的用法統一可以用 pathlib 管理。
  • 老用法在處理不同作業系統 win,mac 以及 linux 之間很吃力。換了作業系統常常要改程式碼,還經常需要進行一些額外操作。
  • 老用法主要是函數形式,返回的資料型別通常是字串。但是路徑和字串並不等價,所以在使用 os 操作路徑的時候常常還要引入其他類庫協助操作。新用法是物件導向,處理起來更靈活方便。
  • pathlib 簡化了很多操作,用起來更輕鬆。

常用的 pathlib 和 os 對比圖

操作os and os.pathpathlib
絕對路徑os.path.abspathPath.resolve
修改許可權os.chmodPath.chmod
建立目錄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 獲取當前資料夾路徑

需注意的是,返回的不是字串,而是 WindowsPath 物件

from pathlib import Path

# 1.可以直接呼叫類方法.cwd()
print(Path.cwd())  # C:UsersdellPycharmProjectsuntitled3demo

# 2.也可以範例化後呼叫
p = Path('./')
print(p.cwd()) # C:UsersdellPycharmProjectsuntitled3demo
print(type(p.cwd()))  # <class 'pathlib.WindowsPath'>

獲取當前檔案路徑

from pathlib import Path

# 當前檔案路徑
p = Path(__file__)
print(p)

獲取 Path 物件絕對路徑

from pathlib import Path

# 當前檔案路徑
p = Path('data.json')
print(p)  # data.json 物件
print(p.absolute())  # C:UsersdellPycharmProjectsuntitled3demodata.json

一些常用的獲取檔案屬性

from pathlib import Path

# 當前檔案路徑
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:UsersdellPycharmProjectsuntitled3demo
print(p.parent.parent)  # C:UsersdellPycharmProjectsuntitled3
print(p.parents)  # 所有的父級 <WindowsPath.parents>
print(p.anchor)  # 錨,目錄前面的部分 C: 或者 /

獲取上層,上上層目錄

from pathlib import Path

# .parent 獲取上一層
print(Path.cwd().parent)

# 範例化後呼叫 .parent
p = Path('./')
print(p.cwd().parent)

獲取上上層使用鏈式方法呼叫 .parent.parent

from pathlib import Path

# .parent 獲取上一層
print(Path.cwd().parent.parent)

# 範例化後呼叫 .parent
p = Path('./')
print(p.cwd().parent.parent)

獲取使用者home目錄

from pathlib import Path
print(Path.home())  # c:Usersdell

判斷檔案,資料夾

is_file()判斷是不是檔案

from pathlib import Path

# 1.  is_file() 判斷是不是檔案
print(Path.cwd().is_file())  # False

# 2.也可以範例化後呼叫
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.也可以範例化後呼叫
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

# 當前檔案路徑
p = Path(__file__)
print(p)
print(p.is_absolute())  # True

joinpath 拼接目錄

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

from pathlib import Path

# 當前檔案路徑
p = Path('./')
print(p.absolute())  # C:UsersdellPycharmProjectsuntitled3demo
print(p.joinpath('data.json'))  # data.json
print(p.joinpath('data.json').absolute())   # C:UsersdellPycharmProjectsuntitled3demodata.json
# 拼接多層
print(p.joinpath('files', 'data.json'))   # filesdata.json
print(p.joinpath('files', 'data.json').absolute())  # C:UsersdellPycharmProjectsuntitled3demofilesdata.json

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

from pathlib import Path

# 當前檔案路徑
p = Path('./')
# / 拼接
new_path = p / 'files' / 'data.json'
print(new_path.absolute())

iterdir()遍歷檔案目錄

比如在當前指令碼的 files 目錄有以下資料夾和子檔案

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

from pathlib import Path

# 當前檔案路徑
p = Path('files')
for i in p.iterdir():
    print(i.absolute())

"""執行結果:
C:UsersdellPycharmProjectsuntitled3demofilesjson
C:UsersdellPycharmProjectsuntitled3demofilesusername.txt
C:UsersdellPycharmProjectsuntitled3demofilesyaml
"""

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

from pathlib import Path

# 當前檔案路徑
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

# 當前檔案路徑
p = Path('files')
print([i for i in p.iterdir() if i.is_file()])  # [WindowsPath('files/username.txt')]

glob() 和 rglob() 模式匹配(正規表示式)

使用模式匹配(正規表示式)匹配指定的路徑。glob 只會匹配當前目錄下, rglob 會遞迴所有子目錄 比如在當前指令碼的 files 目錄有以下資料夾和子檔案

glob 只會匹配當前目錄下

from pathlib import Path

p = Path('files')
# glob 只會遍歷查詢當前目錄
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 只會遍歷查詢當前目錄
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() 檢查路徑是否符合規則

from pathlib import Path

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

建立檔案操作

touch() 建立檔案

from pathlib import Path

p = Path('xx.json')
p.touch()   # 建立一個xx.json

當檔案已經存在的時候,p.touch() 也不會報錯,因為預設引數 exist_ok=True 如果設定 exist_ok=False, 檔案已經存在,touch就會報錯了

from pathlib import Path

p = Path('xx.json')
p.touch(exist_ok=False)   # 建立一個xx.json

丟擲異常FileExistsError: [Errno 17] File exists: 'xx.json'

mkdir() 建立目錄

在當前指令碼下建立一個yoyo目錄

from pathlib import Path

p = Path('yoyo')
# mkdir 建立yoyo目錄
p.mkdir()

如果想一次性建立多層目錄 'yoyo/json'

from pathlib import Path

p = Path('yoyo/json')
# mkdir 建立yoyo/json目錄
p.mkdir()

此時會丟擲異常FileNotFoundError: [WinError 3] 系統找不到指定的路徑。: 'yoyojson'

遞迴建立目錄mkdir(parents=True)

from pathlib import Path

p = Path('yoyo/json')
# mkdir 建立yoyo/json目錄
p.mkdir(parents=True)

刪除檔案操作

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

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

from pathlib import Path

p = Path('yoyo/json')
# mkdir 建立yoyo/json目錄
p.rmdir()

unlink() 刪除檔案

from pathlib import Path

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

檔案讀寫操作

pathlib 對讀取和寫入進行了簡單的封裝,不再需要重複去開啟檔案和管理檔案的關閉了。

  • .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 模式,如果之前已經有檔案內容,將會被覆蓋。

修改檔案

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)  # 移動到新的位置

總結

到此這篇關於python3利用pathlib替代os.path的文章就介紹到這了,更多相關python3 pathlib替代os.path內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com