<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
如果你還在為操作檔案路徑煩惱,不會使用os.path模組,那麼是時候試試pathlib了。
pathlib 庫從 python3.4 開始,到 python3.6 已經比較成熟。如果你的新專案可以直接用 3.6 以上,建議用 pathlib。相比於老式的 os.path 有幾個優勢:
常用的 pathlib 和 os 對比圖
操作 | os and os.path | pathlib |
---|---|---|
絕對路徑 | os.path.abspath | Path.resolve |
修改許可權 | os.chmod | Path.chmod |
建立目錄 | 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 |
需注意的是,返回的不是字串,而是 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)
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)
from pathlib import Path print(Path.home()) # c:Usersdell
from pathlib import Path # 1. is_file() 判斷是不是檔案 print(Path.cwd().is_file()) # False # 2.也可以範例化後呼叫 p = Path('./data.json') print(p.is_file()) # True
from pathlib import Path # 1. is_file() 判斷是不是檔案 print(Path.cwd().is_dir()) # True # 2.也可以範例化後呼叫 p = Path('./data.json') print(p.is_dir()) # False
from pathlib import Path # exists() 判斷是否存在 p = Path('./data.json') print(p.exists()) # True or False
from pathlib import Path # 當前檔案路徑 p = Path(__file__) print(p) print(p.is_absolute()) # True
可以用類似 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())
比如在當前指令碼的 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 會遞迴所有子目錄 比如在當前指令碼的 files 目錄有以下資料夾和子檔案
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')]) # []
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')]
from pathlib import Path p = Path('data.json') # math 檢查匹配規則 print(p.match('*.json')) # True
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'
在當前指令碼下建立一個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'
from pathlib import Path p = Path('yoyo/json') # mkdir 建立yoyo/json目錄 p.mkdir(parents=True)
刪除目錄非常危險,並且沒有提示,一定要謹慎操作
from pathlib import Path p = Path('yoyo/json') # mkdir 建立yoyo/json目錄 p.rmdir()
from pathlib import Path p = Path('files/username.txt') p.unlink()
pathlib 對讀取和寫入進行了簡單的封裝,不再需要重複去開啟檔案和管理檔案的關閉了。
from pathlib import Path p = Path('yo.txt') p.write_text("hello world") print(p.read_text()) # hello world
file.write 操作使用的是 w 模式,如果之前已經有檔案內容,將會被覆蓋。
from pathlib import Path p = Path('yo.txt') p.write_text("hello world") print(p.read_text()) # hello world p.replace('xx.json')
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!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45