python標(biāo)準(zhǔn)庫pathlib常見操作

pathlib—— 面向?qū)ο蟮奈募到y(tǒng)路徑
它是python3.4新增的一個(gè)標(biāo)準(zhǔn)庫,提供了不同操作系統(tǒng)下文件系統(tǒng)路徑的操作方式,有兩大類一個(gè)是純路徑不帶I/0操作,另一個(gè)可以進(jìn)行I/0的類。pathlib各個(gè)類的繼承關(guān)系如下圖:

圖來自python官方文檔

一般情況,對pathlib不熟悉,用Path就夠了,它功能足夠強(qiáng)大,個(gè)人覺得與相比os.path相比,更加人性化。下文將介紹一些常見操作:

構(gòu)建Path類路徑對象

pathlib中不區(qū)分路徑分隔符的,在win系統(tǒng)下可以直接用'/'。還可以用 / 創(chuàng)建子路徑。感覺比直接字符串拼接和利用os.path.join()更加簡潔

from pathlib import Path, PurePath

#直接傳進(jìn)一個(gè)完整字符串
p = Path('C:/Users/dongh/Documents/python_learn/pathlib_/file1.txt')
#也可以傳進(jìn)多個(gè)字符串
p = Path('C:\\', 'Users', 'dongh', 'Documents', 'python_learn', 'pathlib_', 'file1.txt')

#也可以利用Path.joinpath()
p = Path('C:/Users/dongh/Documents).joinpath('python_learn/pathlib_/file1.txt')
#PosixPath('C:/Users/dongh/Documents/python_learn/pathlib_/file1.txt')

#利用 / 可以創(chuàng)建子路徑
p = Path('C:/Users/dongh/Documents)
p = p / 'python_learn/pathlib_/file1.txt'
print(p)
#PosixPath('C:/Users/dongh/Documents/python_learn/pathlib_/file1.txt')

了解對象基本情況

獲取上一級路徑

p = Path('C:/Users/dongh/Documents/python_learn/pathlib_/file1.txt')
#獲取路徑上一級目錄路徑
print(p.parent)#pathlib_\folder1

#獲取上上一級目錄路徑
print(p.parent.parent)
#結(jié)果
C:\Users\dongh\Documents\python_learn\pathlib_
C:\Users\dongh\Documents\python_learn

獲取路徑組件名字(返回的是字符串)

#獲取當(dāng)前路徑文件名的后綴名
#獲取當(dāng)前路徑文件名不帶后綴
#獲取-當(dāng)前路徑文件名帶后綴
print(p.suffix)
print(p.stem)
print(p.name)#pathlib_\folder1

#獲取上一級目錄路徑名字
print(p.parent.name)

#獲取上上一級目錄路徑名字
print(p.parent.parent.name)
#結(jié)果
.txt
file1
file1.txt

pathlib_
python_learn

將路徑分成不同組分(返回一個(gè)元組)

print(p.parts)
#('C:\\', 'Users', 'dongh', 'Documents', 'python_learn', 'pathlib_', 'file1.txt')

深入了解對象

哈哈,簡單了解對象的是不夠的~~~萬一對象不存在呢
判斷對象屬性

#判斷對象是否存在,存在返回True,反之返回False
p.exists()
#判斷對象是否是目錄,存在返回True,反之返回False
p.is_dir()
#判斷對象是否是文件,存在返回True,反之返回False
p.is_file()

遍歷文件夾下的路徑

#p指向的是一個(gè)文件不是文件夾。它的上一級才是文件
for i in p.parent.iterdir():
    print(i,)
"""
C:\Users\dongh\Documents\python_learn\pathlib_\file1
C:\Users\dongh\Documents\python_learn\pathlib_\file2
C:\Users\dongh\Documents\python_learn\pathlib_\folder1
C:\Users\dongh\Documents\python_learn\pathlib_\folder2
C:\Users\dongh\Documents\python_learn\pathlib_\folder3
C:\Users\dongh\Documents\python_learn\pathlib_\test.py
C:\Users\dongh\Documents\python_learn\pathlib_\file1.txt
"""

有目的尋找

#* 表示匹配任意字符串,但這只能在當(dāng)前目錄下尋找
for i in p.parent.glob('*.txt'):
    print(i)
'''
C:\Users\dongh\Documents\python_learn\pathlib_\file1.txt
C:\Users\dongh\Documents\python_learn\pathlib_\file2.txt
'''
#尋找當(dāng)前路徑的下一路徑的內(nèi)容
for i in p.parent.glob('*/*.txt'):
    print(i)
'''
C:\Users\dongh\Documents\python_learn\pathlib_\folder1\folder_file1.txt
C:\Users\dongh\Documents\python_learn\pathlib_\folder2\folder2.txt
'''
#尋找當(dāng)前路徑下所有符合條件文件
#' ** '意思當(dāng)前路徑和它的所有子路徑,相當(dāng)于循環(huán)匹配一遍子路徑
#和Path.rglob()效果一樣
for i in p.parent.glob('**/*.txt'):#for i in p.parent.rglob('*.txt')
    print(i)
'''
C:\Users\dongh\Documents\python_learn\pathlib_\file1.txt
C:\Users\dongh\Documents\python_learn\pathlib_\file2.txt
C:\Users\dongh\Documents\python_learn\pathlib_\folder1\folder_file1.txt
C:\Users\dongh\Documents\python_learn\pathlib_\folder1\sub_folder1\sub_file1.txt
C:\Users\dongh\Documents\python_learn\pathlib_\folder2\folder2.txt
'''

對對象動點(diǎn)手腳

寫入數(shù)據(jù)

#寫入二進(jìn)制數(shù)據(jù)
p.write_bytes(b'hello world!')
#寫入文本
p.write_text('hello world!')

#打開文件可以發(fā)現(xiàn)文件內(nèi)有'hello world!'。

讀取數(shù)據(jù)

#讀二進(jìn)制數(shù)據(jù)
print(p.read_bytes())
#b'hello world!'

#讀文本
p.read_text()
#'hello world!'

Path.open()和內(nèi)置open()差不多

with p.open('r') as f:
    print(f.read())
#hello world!
with p.open('w') as f:
    f.write('hello again!')

給對象改個(gè)名字

p.rename('new_file.txt')
#原來的'file1.txt'被改成new_file.txt',文件內(nèi)的內(nèi)容不變。

創(chuàng)造新的路徑

p.mkdir()
#將創(chuàng)建一個(gè)名為p.name的新文件夾。
p.rmdir()
#將刪除這個(gè)文件夾,它必須是空的才能夠刪除

判斷文件是否一樣

print(p.samefile('file1.txt'))
#返回True

改變新的路徑或后綴名并返回新的路徑(原來的路徑不被改變)

print(p.with_name('new_file1.txt'))
'C:/Users/dongh/Documents/python_learn/pathlib_/new_file1.txt'
print(p.with_suffix('.csv'))
'C:/Users/dongh/Documents/python_learn/pathlib_/file1.csv'

更多詳細(xì)內(nèi)容請查看python官方教程
其他文章
python制作字符表格
python爬取必應(yīng)學(xué)術(shù)
python控制臺動畫

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1.ios高性能編程 (1).內(nèi)層 最小的內(nèi)層平均值和峰值(2).耗電量 高效的算法和數(shù)據(jù)結(jié)構(gòu)(3).初始化時(shí)...
    歐辰_OSR閱讀 30,238評論 8 265
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,554評論 19 139
  • 一、基礎(chǔ)知識:1、JVM、JRE和JDK的區(qū)別:JVM(Java Virtual Machine):java虛擬機(jī)...
    殺小賊閱讀 2,563評論 0 4
  • 有時(shí)候總會想自己是否擁有一些東西。 朋友 我生命中最為看中的,可能有人會問為什么不是親人,親人因?yàn)檠夑P(guān)系永遠(yuǎn)烙印...
    特立獨(dú)行的作業(yè)員閱讀 248評論 0 0
  • 關(guān)于農(nóng)村里的生活,從小到大也是體驗(yàn)過好幾回的。今年冬天,因?yàn)橐狡牌殴枢l(xiāng)給婆婆辦理第三年的祭奠儀式,又一次來...
    山谷的明月閱讀 476評論 6 6

友情鏈接更多精彩內(nèi)容