路径处理库pathlib使用详解
原文鏈接:https://blog.csdn.net/itanders/article/details/88754606
在編程中處理文件的讀寫操作時免不了要和文件路徑打交道,甚至有時候為了完成某些場景功能會變的有些繁瑣,以前在Python中操作文件路徑,我們更多的時候是使用os模塊。
而到了Python3時代后,Python3的系統標準庫pathlib模塊的 Path 對路徑的操作會更簡單。甚至可以說pathlib已經可以完全替代os.path,它完全采用面向對象的編程方式,因為Python 文檔給它的定義是 Object-oriented filesystem paths(面向對象的文件系統路徑),其語義適用于不同的操作系統,它繼承純路徑但也提供I/O化操作,在處理配置路徑方面十分簡單。
這里要特殊說明下,我們所有的例子中都導入了pathlib2模塊而不是pathlib模塊,因為簡單引用官方的話說就是老版本的pathlib模塊已經只作為修復bug模式存在,而新版本的pathlib2是以修補更新的pathlib2而發布的,而且所有的新功能都可以兼容過去的舊版本python。
好了,來讓我們看下常用的pathlib操作的例子匯總:
返回當前工作目錄路徑和Home路徑
在pathlib里一切都是面向對象的,只需要調用指定的方法就可以了。
from pathlib2 import Path# 獲取當前目錄 current_path = Path.cwd() print(current_path)# 獲取Home目錄 home_path = Path.home() print(home_path)父目錄操作
你可以看到想要獲取一個路徑下上級的父目錄可以非常方便的直接使用面向對象的方式.parent就行了,如果還想上一級就繼續以子對象繼續操作parent屬性就可以了。
from pathlib2 import Path# 獲取當前目錄 current_path = Path.cwd() print(current_path) # D:\IDEA\ipoad_ywk\test\demo_pathlib# 獲取上級父目錄 print(current_path.parent) # D:\IDEA\ipoad_ywk\test# 獲取上上級父目錄 print(current_path.parent.parent) # D:\IDEA\ipoad_ywk# 獲取上上上級父目錄 print(current_path.parent.parent.parent) # D:\IDEA當然路徑是十分長的,而且在特定的場合我如果想獲得每一級的父目錄呢,貼心的pathlib已經幫我們想到了,使用parents屬性就可以遍歷整個父目錄了,如下例子的效果和上面的例子是完全一樣的,但是就變的非常簡便。
from pathlib2 import Path# 獲取當前目錄 current_path = Path.cwd() print(current_path) # D:\IDEA\ipoad_ywk\test\demo_pathlib# 獲取上級父目錄 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 目錄的最后一個部分
suffix 目錄中最后一個部分的擴展名
suffixes 返回多個擴展名列表
stem 目錄最后一個部分,沒有后綴
with_name(name) 替換目錄最后一個部分并返回一個新的路徑
with_suffix(suffix) 替換擴展名,返回新的路徑,擴展名存在則不變
from pathlib2 import Path# 返回目錄中最后一個部分的擴展名 example_path = Path("D:\IDEA\ipoad_ywk\test\demo_pathlib\demo.txt") print(example_path.suffix) # .txt# 返回目錄中多個擴展名列表 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# 替換目錄最后一部分的文件名并返回一個新的路徑 new_path1 = example_path.with_name('def.txt') print(new_path1) # D:\IDEA\ipoad_ywk\test\demo_pathlib\def.txt# 替換目錄最后一部分的文件名并返回一個新的路徑 new_path2 = example_path.with_suffix('.gif') print(new_path2) # D:\IDEA\ipoad_ywk\test\demo_pathlib\demo.gif路徑拼接和分解
from pathlib2 import Path# 直接傳進去一個完整字符串 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))# 直接傳進一個完整字符串 example_path1 = Path('/Users/Anders/Documents/powershell-2.jpg') # \Users\Anders\Documents\powershell-2.jpg <class 'pathlib2.WindowsPath'> print(example_path1, type(example_path1))# 也可以傳進多個字符串 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# #利用 / 可以創建子路徑 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遍歷文件夾
我們可以在路徑對象后面直接使用iterdir()方法,該方法返回一個生成器,我們可以循環遍歷出所有指定目錄下的目錄路徑。
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里如果要打開一個文件也十分的簡單,只需要open方法就可以,它的操作語法是:
open(mode=‘r’, bufferiong=-1, encoding=None, errors=None, newline=None)
對于簡單的文件讀寫,在pathlib庫中有幾個簡便的方法:
.read_text(): 以文本模式打開路徑并并以字符串形式返回內容。
.read_bytes(): 以二進制/字節模式打開路徑并以字節串的形式返回內容。
.write_text(): 打開路徑并向其寫入字符串數據。
.write_bytes(): 以二進制/字節模式打開路徑并向其寫入數據。
比如可以把之前的例子改寫如下:
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)創建文件夾和刪除文件夾
關于這里的創建文件目錄mkdir方法接收兩個參數:
- parents:如果父目錄不存在,是否創建父目錄。
- exist_ok:只有在目錄不存在時創建目錄,目錄已存在時不會拋出異常。
判斷文件及文件夾是否存在
關于文件的判斷還有很多相關屬性,羅列如下:
is_dir() 是否是目錄
is_file() 是否是普通文件
is_symlink() 是否是軟鏈接
is_socket() 是否是socket文件
is_block_device() 是否是塊設備
is_char_device() 是否是字符設備
is_absolute() 是否是絕對路徑
resolve() 返回一個新的路徑,這個新路徑就是當前Path對象的絕對路徑,如果是軟鏈接則直接被解析
absolute() 也可以獲取絕對路徑,但是推薦resolve()
exists() 該路徑是否指向現有的目錄或文件:
from pathlib2 import Pathexample_path = Path('/Users/Anders/Documents/pic-2.jpg')# 判斷對象是否存在 print(example_path.exists()) # 輸出如下: # True# 判斷對象是否是目錄 print(example_path.is_dir()) # 輸出如下: # False# 判斷對象是否是文件 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總結
以上是生活随笔為你收集整理的路径处理库pathlib使用详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: vue 操作列的自定义
- 下一篇: 【网络安全】SSH协议科普文