路径处理库pathlib使用详解
原文鏈接:https://blog.csdn.net/itanders/article/details/88754606
在編程中處理文件的讀寫操作時(shí)免不了要和文件路徑打交道,甚至有時(shí)候?yàn)榱送瓿赡承﹫鼍肮δ軙?huì)變的有些繁瑣,以前在Python中操作文件路徑,我們更多的時(shí)候是使用os模塊。
而到了Python3時(shí)代后,Python3的系統(tǒng)標(biāo)準(zhǔn)庫pathlib模塊的 Path 對(duì)路徑的操作會(huì)更簡單。甚至可以說pathlib已經(jīng)可以完全替代os.path,它完全采用面向?qū)ο蟮木幊谭绞?#xff0c;因?yàn)镻ython 文檔給它的定義是 Object-oriented filesystem paths(面向?qū)ο蟮奈募到y(tǒng)路徑),其語義適用于不同的操作系統(tǒng),它繼承純路徑但也提供I/O化操作,在處理配置路徑方面十分簡單。
這里要特殊說明下,我們所有的例子中都導(dǎo)入了pathlib2模塊而不是pathlib模塊,因?yàn)楹唵我霉俜降脑捳f就是老版本的pathlib模塊已經(jīng)只作為修復(fù)bug模式存在,而新版本的pathlib2是以修補(bǔ)更新的pathlib2而發(fā)布的,而且所有的新功能都可以兼容過去的舊版本python。
好了,來讓我們看下常用的pathlib操作的例子匯總:
返回當(dāng)前工作目錄路徑和Home路徑
在pathlib里一切都是面向?qū)ο蟮?#xff0c;只需要調(diào)用指定的方法就可以了。
from pathlib2 import Path# 獲取當(dāng)前目錄 current_path = Path.cwd() print(current_path)# 獲取Home目錄 home_path = Path.home() print(home_path)父目錄操作
你可以看到想要獲取一個(gè)路徑下上級(jí)的父目錄可以非常方便的直接使用面向?qū)ο蟮姆绞?parent就行了,如果還想上一級(jí)就繼續(xù)以子對(duì)象繼續(xù)操作parent屬性就可以了。
from pathlib2 import Path# 獲取當(dāng)前目錄 current_path = Path.cwd() print(current_path) # D:\IDEA\ipoad_ywk\test\demo_pathlib# 獲取上級(jí)父目錄 print(current_path.parent) # D:\IDEA\ipoad_ywk\test# 獲取上上級(jí)父目錄 print(current_path.parent.parent) # D:\IDEA\ipoad_ywk# 獲取上上上級(jí)父目錄 print(current_path.parent.parent.parent) # D:\IDEA當(dāng)然路徑是十分長的,而且在特定的場合我如果想獲得每一級(jí)的父目錄呢,貼心的pathlib已經(jīng)幫我們想到了,使用parents屬性就可以遍歷整個(gè)父目錄了,如下例子的效果和上面的例子是完全一樣的,但是就變的非常簡便。
from pathlib2 import Path# 獲取當(dāng)前目錄 current_path = Path.cwd() print(current_path) # D:\IDEA\ipoad_ywk\test\demo_pathlib# 獲取上級(jí)父目錄 for p in current_path.parents:print(p) """ D:\IDEA\ipoad_ywk\test\demo_pathlib D:\IDEA\ipoad_ywk\test D:\IDEA\ipoad_ywk D:\IDEA D:\ """文件名操作
name 目錄的最后一個(gè)部分
suffix 目錄中最后一個(gè)部分的擴(kuò)展名
suffixes 返回多個(gè)擴(kuò)展名列表
stem 目錄最后一個(gè)部分,沒有后綴
with_name(name) 替換目錄最后一個(gè)部分并返回一個(gè)新的路徑
with_suffix(suffix) 替換擴(kuò)展名,返回新的路徑,擴(kuò)展名存在則不變
from pathlib2 import Path# 返回目錄中最后一個(gè)部分的擴(kuò)展名 example_path = Path("D:\IDEA\ipoad_ywk\test\demo_pathlib\demo.txt") print(example_path.suffix) # .txt# 返回目錄中多個(gè)擴(kuò)展名列表 example_paths = Path("D:\IDEA\ipoad_ywk\test\demo_pathlib\abc.tar.gz") print(example_paths.suffixes) # ['.tar', '.gz']# 返回目錄中最后一部分文件名,但不包含后綴 example_path = Path("D:\IDEA\ipoad_ywk\test\demo_pathlib\demo.txt") print(example_path.stem) # demo# 返回目錄中最后一部分文件名 example_path = Path(r'D:\IDEA\ipoad_ywk\test\demo_pathlib\demo.txt') print(example_path.name) # demo.txt# 替換目錄最后一部分的文件名并返回一個(gè)新的路徑 new_path1 = example_path.with_name('def.txt') print(new_path1) # D:\IDEA\ipoad_ywk\test\demo_pathlib\def.txt# 替換目錄最后一部分的文件名并返回一個(gè)新的路徑 new_path2 = example_path.with_suffix('.gif') print(new_path2) # D:\IDEA\ipoad_ywk\test\demo_pathlib\demo.gif路徑拼接和分解
from pathlib2 import Path# 直接傳進(jìn)去一個(gè)完整字符串 example_path0 = Path(r'D:\IDEA\ipoad_ywk\test\demo_pathlib\demo.txt') # D:\IDEA\ipoad_ywk\test\demo_pathlib\demo.txt <class 'pathlib2.WindowsPath'> print(example_path0, type(example_path0))# 直接傳進(jìn)一個(gè)完整字符串 example_path1 = Path('/Users/Anders/Documents/powershell-2.jpg') # \Users\Anders\Documents\powershell-2.jpg <class 'pathlib2.WindowsPath'> print(example_path1, type(example_path1))# 也可以傳進(jìn)多個(gè)字符串 example_path2 = Path('/', 'Users', 'dongh', 'Documents', 'python_learn', 'pathlib_', 'file1.txt') print(example_path2) # \Users\dongh\Documents\python_learn\pathlib_\file1.txt# 也可以利用Path.joinpath() example_path3 = Path('/Users/Anders/Documents/').joinpath('python_learn') print(example_path3) # \Users\Anders\Documents\python_learn# #利用 / 可以創(chuàng)建子路徑 example_path4 = Path('/Users/Anders/Documents') print(example_path4) # \Users\Anders\Documentsexample_path5 = example_path4 / 'python_learn/pic-2.jpg' print(example_path5) # \Users\Anders\Documents\python_learn\pic-2.jpg遍歷文件夾
我們可以在路徑對(duì)象后面直接使用iterdir()方法,該方法返回一個(gè)生成器,我們可以循環(huán)遍歷出所有指定目錄下的目錄路徑。
from pathlib2 import Pathexample_path = Path(r"D:\IDEA\ipoad_ywk\test\demo_pathlib") var = [path for path in example_path.iterdir()] print(var) """ [WindowsPath('D:/IDEA/ipoad_ywk/test/demo_pathlib/abc.tar.gz'), WindowsPath('D:/IDEA/ipoad_ywk/test/demo_pathlib/demo.txt'), WindowsPath('D:/IDEA/ipoad_ywk/test/demo_pathlib/demo1.txt'), WindowsPath('D:/IDEA/ipoad_ywk/test/demo_pathlib/demo_ospath.py'), WindowsPath('D:/IDEA/ipoad_ywk/test/demo_pathlib/demo_pathlib.py'), WindowsPath('D:/IDEA/ipoad_ywk/test/demo_pathlib/demo_pathlib2.py')] """文件操作
文件操作是使用率非常高的操作,在pathlib里如果要打開一個(gè)文件也十分的簡單,只需要open方法就可以,它的操作語法是:
open(mode=‘r’, bufferiong=-1, encoding=None, errors=None, newline=None)
對(duì)于簡單的文件讀寫,在pathlib庫中有幾個(gè)簡便的方法:
.read_text(): 以文本模式打開路徑并并以字符串形式返回內(nèi)容。
.read_bytes(): 以二進(jìn)制/字節(jié)模式打開路徑并以字節(jié)串的形式返回內(nèi)容。
.write_text(): 打開路徑并向其寫入字符串?dāng)?shù)據(jù)。
.write_bytes(): 以二進(jìn)制/字節(jié)模式打開路徑并向其寫入數(shù)據(jù)。
比如可以把之前的例子改寫如下:
from pathlib2 import Pathexample_path = Path(r"D:\IDEA\ipoad_ywk\test\demo_pathlib\demo.txt") txt = example_path.read_text(encoding="UTF-8") print(txt)創(chuàng)建文件夾和刪除文件夾
關(guān)于這里的創(chuàng)建文件目錄mkdir方法接收兩個(gè)參數(shù):
- parents:如果父目錄不存在,是否創(chuàng)建父目錄。
- exist_ok:只有在目錄不存在時(shí)創(chuàng)建目錄,目錄已存在時(shí)不會(huì)拋出異常。
判斷文件及文件夾是否存在
關(guān)于文件的判斷還有很多相關(guān)屬性,羅列如下:
is_dir() 是否是目錄
is_file() 是否是普通文件
is_symlink() 是否是軟鏈接
is_socket() 是否是socket文件
is_block_device() 是否是塊設(shè)備
is_char_device() 是否是字符設(shè)備
is_absolute() 是否是絕對(duì)路徑
resolve() 返回一個(gè)新的路徑,這個(gè)新路徑就是當(dāng)前Path對(duì)象的絕對(duì)路徑,如果是軟鏈接則直接被解析
absolute() 也可以獲取絕對(duì)路徑,但是推薦resolve()
exists() 該路徑是否指向現(xiàn)有的目錄或文件:
from pathlib2 import Pathexample_path = Path('/Users/Anders/Documents/pic-2.jpg')# 判斷對(duì)象是否存在 print(example_path.exists()) # 輸出如下: # True# 判斷對(duì)象是否是目錄 print(example_path.is_dir()) # 輸出如下: # False# 判斷對(duì)象是否是文件 print(example_path.is_file()) # 輸出如下: # True文件信息
只需要通過.stat()方法就可以返還指定路徑的文件信息。
from pathlib2 import Pathexample_path = Path('/Users/Anders/Documents/pic.jpg') print(example_path.stat()) # 輸出如下: # os.stat_result(st_mode=33188, st_ino=8598206944, st_dev=16777220, st_nlink=1, st_uid=501, st_gid=20, st_size=38054, st_atime=1549547190, st_mtime=1521009880, st_ctime=1521009883)print(example_path.stat().st_size) # 輸出如下: # 38054總結(jié)
以上是生活随笔為你收集整理的路径处理库pathlib使用详解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: vue 操作列的自定义
- 下一篇: 【网络安全】SSH协议科普文