對於 Python 中的路徑操作,大多數人第一反應肯定是 os,可以說 os 已經在老一輩 Python coder 心中紮深蒂固,現存的很多教程中操作路徑仍然使用 os,殊不知從 python3.4 開始,pathlib 正式成為標準庫,已經能夠完全取代 os。 無論從功能還是易用性都已經超越 os。
看個經典的例子,我們分別使用 os 與 pathlib 來獲取上層目錄和上上層目錄。
os 方法
import os.path
# 獲取上層目錄
os.path.dirname(os.getcwd())
# 獲取上上層目錄
os.path.dirname(os.path.dirname(os.getcwd()))
pathlib 方法
from pathlib import Path
# 獲取上層目錄
Path.cwd().parent
# 獲取上上層目錄
Path.cwd().parent.parent
[鏈式呼叫]完敗[巢狀呼叫] ,pathlib 是物件導向的模組,使用起來非常靈活方便,下面就詳細看看 pathlib 常見操作。 建議大家收藏備用!
安裝 pathlib 模組
pathlib常見操作
獲取絕對路徑
建立檔/目錄
檔/目錄判斷
路徑拼接/拆分
獲取檔/目錄資訊
遍歷目錄
重新命名/移動檔
刪除檔/目錄
安裝 pathlib 模組
透過命令列直接安裝。
pip install pathlib
也可以使用豆瓣映像安裝。
pip install -i https://pypi.douban.com/simple pathlib
執行上述命令後,可以檢查一下是否安裝成功。
pip show pathlib
pathlib常見操作
獲取絕對路徑
獲取當前絕對路徑,兩種方法。
>>> Path().cwd()
WindowsPath('E:/material/pathlib用法')
>>> Path().resolve()
WindowsPath('E:/material/pathlib用法')
建立檔/目錄
建立目錄時要註意兩個參數:
parents
:預設為 False,如果父目錄不存在,會丟擲異常,True 則建立這些目錄。
exist_ok
:預設為 False,目錄已存在時會丟擲異常。
這裏我們在 material 目錄下建立 test 資料夾。
>>> p = Path(r'E:\material\test')
>>> p.mkdir(parents=True, exist_ok=True)
touch()
用於建立空檔,父級目錄必須存在,否則丟擲異常。
>>> p = Path('E:/material/test1.txt')
>>> p.touch(exist_ok=True)
檔/目錄判斷
判斷是否為資料夾
>>> Path('E:/material/pathlib用法').is_dir()
True
判斷是否為檔
>>> Path('E:/material/pathlib用法/txt檔.txt').is_file()
True
判斷路徑是否存在
>>> Path('E:/material/error.txt').exists()
False
路徑拼接/拆分
Path類路徑拼接的兩種方法。
>>> Path('E:/material', 'pathlib用法')
WindowsPath('E:/material/pathlib用法')
>>> Path.cwd().parent.joinpath('pathlib用法')
WindowsPath('E:/material/pathlib用法')
使用
'/'
進行路徑拼接。
Path Object / Path Object
str / Path Object
Path Object / str
>>> Path('E:/') / Path('/material/')
WindowsPath('E:/material')
>>> 'E:/' / Path('/material/')
WindowsPath('E:/material')
>>> Path('E:/') / '/material/'
WindowsPath('E:/material')
按照分隔符將檔路徑分割
>>> p.parts
('E:\\', 'material', 'pathlib用法')
獲取檔/目錄資訊
獲取檔/目錄名。
>>> p = Path('E:/material/pathlib用法/excel檔.xlsx')
>>> p.name
'excel檔.xlsx'
獲取不包含字尾的檔名。
>>> p.stem
'excel檔'
獲取檔字尾名。
>>> p.suffix
'.xlsx'
獲取錨,最前面的部份
E:\
。
>>> p.anchor
'E:\\'
獲取上層目錄路徑
>>> p = path.cwd()
>>> p.parent
WindowsPath('E:/material')
獲取所有上層目錄路徑
>>> [path for path in p.parents]
[WindowsPath('E:/material'), WindowsPath('E:/')]
獲取檔/目錄內容。
>>> p.stat()
os.stat_result(st_mode=33206, st_ino=562949953976250, st_dev=503425376, st_nlink=1, st_uid=0, st_gid=0, st_size=6611, st_atime=1642130252, st_mtime=1642062067, st_ctime=1642066962)
獲取檔/目錄大小,單位字節(B)
>>> p.stat().st_size
6611
獲取檔/目錄修改時間。
>>> p.stat().st_mtime
1642062067.4264374
獲取檔/目錄建立時間。
>>> p.stat().st_ctime
1642066962.072431
上面獲取的時間都是時間戳,透過
datetime
模組轉成標準日期格式。
>>> from datetime import datetime
>>> date = datetime.utcfromtimestamp(p.stat().st_ctime)
>>> date.strftime("%Y-%m-%d %H:%M:%S")
'2022-01-13 09:42:42'
遍歷目錄
範例資料夾
┌ .ipynb_checkpoints
├ └ Pathlib用法-checkpoint.ipynb
├ csv檔.csv
├ excel檔.xlsx
├ Pathlib用法.ipynb
├ py檔.py
└ txt檔.txt
遍歷目錄下所有檔,返回一個包含結果路徑的叠代器。
>>> p = Path.cwd()
>>> [path for path in p.iterdir()]
[WindowsPath('E:/material/pathlib用法/.ipynb_checkpoints'),
WindowsPath('E:/material/pathlib用法/csv檔.csv'),
WindowsPath('E:/material/pathlib用法/excel檔.xlsx'),
WindowsPath('E:/material/pathlib用法/Pathlib用法.ipynb'),
WindowsPath('E:/material/pathlib用法/py檔.py'),
WindowsPath('E:/material/pathlib用法/txt檔.txt')]
根據指定正則匹配目錄下的檔, 不匹配 子目錄內的檔。
>>> [path for path in p.glob('*.txt')]
[WindowsPath('E:/material/pathlib用法/txt檔.txt')]
根據指定正則匹配目錄下的檔, 匹配 子目錄內的檔。
>>> [path for path in p.rglob('*.ipynb')]
[WindowsPath('E:/material/pathlib用法/Pathlib用法.ipynb'),
WindowsPath('E:/material/pathlib用法/.ipynb_checkpoints/Pathlib用法-checkpoint.ipynb')]
重新命名/移動檔
rename()
重新命名檔,當新命名的檔重復時,會丟擲異常。下面我們將
test1.txt
檔先重新命名為
test2.txt
,再修改字尾名為
test2.json
。
>>> p = Path('E:/material/test1.txt')
>>> new_name = p.with_name('test2.txt')
>>> p.rename(new_name)
WindowsPath('E:/material/test2.txt')
>>> new_suffix = new_name.with_suffix('.json')
>>> new_name.rename(new_suffix)
WindowsPath('E:/material/test2.json')
移動檔,當新路徑下檔已存在時,無法建立該檔。
>>> p = Path('E:/material/test2.txt')
>>> p.rename('E:/material/pathlib用法/test3.txt')
WindowsPath('E:/material/pathlib用法/test3.txt')
replace()
replace()
與
rename()
用法基本相同,唯一不同點就是當新命名的檔重復時,
replace()
不會丟擲異常,而是直接覆蓋舊檔。
刪除檔/目錄
刪除檔,
missing_ok=True
設定檔不存在不會丟擲異常。
>>> p = Path('E:/material/pathlib用法/not_exist.txt')
>>> p.unlink(missing_ok=True)
刪除目錄,目錄必須為空,否則丟擲異常。
>>> p = Path('E:/material/pathlib用法/test')
>>> p.rmdir()
以上就是
pathlib
常見操作,足以解決日常工作中的絕大多數問題,
收藏,點贊,轉發
支持一下吧!
作者: Python丁小傑
來源 :Python新視野
Crossin的新書【 碼上行動:用ChatGPT學會Python編程 】已經上市了。 本書以ChatGPT為輔助,系統全面地講解了如何掌握Python編程,適合Python零基礎入門的讀者學習。
購買後可加入讀者交流群,Crossin為你開啟陪讀模式,解答你在閱讀本書時的一切疑問。
Crossin的其他書籍:
添加微信 crossin123 ,加入編程教室共同學習 ~
感謝 轉發 和 點贊 的各位~