python3利用pathlib替代os.path的方法實(shí)例
前言
如果你還在為操作文件路徑煩惱,不會使用os.path模塊,那么是時候試試pathlib了。
pathlib 庫
pathlib 庫從 python3.4 開始,到 python3.6 已經(jīng)比較成熟。如果你的新項(xià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)常需要進(jìn)行一些額外操作。
- 老用法主要是函數(shù)形式,返回的數(shù)據(jù)類型通常是字符串。但是路徑和字符串并不等價,所以在使用 os 操作路徑的時候常常還要引入其他類庫協(xié)助操作。新用法是面向?qū)ο?,處理起來更靈活方便。
- pathlib 簡化了很多操作,用起來更輕松。
常用的 pathlib 和 os 對比圖
操作 | os and os.path | pathlib |
---|---|---|
絕對路徑 | os.path.abspath | Path.resolve |
修改權(quán)限 | os.chmod | Path.chmod |
創(chuàng)建目錄 | os.mkdir | 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 and Path.home |
是否為目錄 | os.path.isdir | Path.is_dir |
是否為文件 | os.path.isfile | Path.is_file |
是否為連接 | os.path.islink | Path.is_symlink |
文件屬性 | 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 |
pathlib 獲取文件路徑
Path.cwd 獲取當(dāng)前文件夾路徑
需注意的是,返回的不是字符串,而是 WindowsPath 對象
from pathlib import Path # 1.可以直接調(diào)用類方法.cwd() print(Path.cwd()) # C:\Users\dell\PycharmProjects\untitled3\demo # 2.也可以實(shí)例化后調(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) # 實(shí)例化后調(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) # 實(shí)例化后調(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.也可以實(shí)例化后調(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.也可以實(shí)例化后調(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 支持用 / 拼接路徑, 這種語法估計(jì)用的人很少
from pathlib import Path # 當(dāng)前文件路徑 p = Path('./') # / 拼接 new_path = p / 'files' / 'data.json' print(new_path.absolute())
iterdir()遍歷文件目錄
比如在當(dāng)前腳本的 files 目錄有以下文件夾和子文件
.iterdir() 遍歷某個目錄下的所有路徑(文件和子目錄)
from pathlib import Path # 當(dāng)前文件路徑 p = Path('files') for i in p.iterdir(): print(i.absolute()) """運(yùn)行結(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() 模式匹配(正則表達(dá)式)
使用模式匹配(正則表達(dá)式)匹配指定的路徑。glob 只會匹配當(dāng)前目錄下, rglob 會遞歸所有子目錄 比如在當(dāng)前腳本的 files 目錄有以下文件夾和子文件
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() 也不會報(bào)錯,因?yàn)槟J(rèn)參數(shù) exist_ok=True 如果設(shè)置 exist_ok=False, 文件已經(jīng)存在,touch就會報(bào)錯了
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)
刪除文件操作
刪除目錄非常危險(xiǎn),并且沒有提示,一定要謹(jǐn)慎操作
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 對讀取和寫入進(jìn)行了簡單的封裝,不再需要重復(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) # 移動到新的位置
總結(jié)
到此這篇關(guān)于python3利用pathlib替代os.path的文章就介紹到這了,更多相關(guān)python3 pathlib替代os.path內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Python中的pathlib庫使用詳解
- python文件與路徑操作神器?pathlib
- Python標(biāo)準(zhǔn)庫pathlib操作目錄和文件
- Python pathlib模塊使用方法及實(shí)例解析
- python中pathlib模塊的基本用法與總結(jié)
- python3 pathlib庫Path類方法總結(jié)
- Python中的pathlib.Path為什么不繼承str詳解
- 對python3中pathlib庫的Path類的使用詳解
- 詳談Python3 操作系統(tǒng)與路徑 模塊(os / os.path / pathlib)
- Python文件系統(tǒng)模塊pathlib庫
相關(guān)文章
Flask如何獲取用戶的ip,查詢用戶的登錄次數(shù),并且封ip
這篇文章主要介紹了Flask如何獲取用戶的ip,查詢用戶的登錄次數(shù),并且封ip問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-01-01使用python實(shí)現(xiàn)CGI環(huán)境搭建過程解析
這篇文章主要介紹了使用python實(shí)現(xiàn)CGI環(huán)境搭建過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-04-04opencv python Canny邊緣提取實(shí)現(xiàn)過程解析
這篇文章主要介紹了opencv python Canny邊緣提取實(shí)現(xiàn)過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-02-02關(guān)于pycharm?python3.7成功安裝dlib庫的問題
這篇文章主要介紹了pycharm?python3.7成功安裝dlib庫的解決方法,本文分步驟給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-12-12Python使用ctypes調(diào)用C/C++的方法
今天小編就為大家分享一篇關(guān)于Python使用ctypes調(diào)用C/C++的方法,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2019-01-01Pycharm導(dǎo)入anaconda環(huán)境的教程圖解
這篇文章主要介紹了Pycharm導(dǎo)入anaconda環(huán)境的教程,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-07-07