python中Path常用功能

1. 基本功能

建議使用pathlib模塊來處理文件和文件夾,可以跨平臺。pathlib提供path對象來操作,包括目錄和文件。

from pathlib import Path
p =Path()     #輸出格式。PosixPath('.')
p =Path('a','b','c/d')  #輸出格式PosixPath('a/b/c/d')
p =Path('/etc')    #PosixPath('/etc')

2. 路徑拼接和分解

使用操作符/進行路徑拼接,有兩種方式:① Path對象/Path對象;② Path對象/字符串,或者字符串/Path對象;也可以使用joinpath方法。

使用Parts屬性進行路徑分解,可以返回路徑中的每一個部分

p = Path() # 當前目錄,PosixPath('.')
p = p/'a'     #PosixPath('a')
p1 = 'b'/p       #PosixPath('b/a')
p2 = Path('c')      #PosixPath('c')
p3 = p2 /p1         #PosixPath('c/b/a')
print(p3.parts)      #('c', 'b', 'a')
p3.joinpath('etc','int.d',Path('.httpd'))     #PosixPath('c/b/a/etc/int.d/.httpd')

3. 獲取路徑

Str獲取路徑字符串。Bytes獲取路徑字符串的bytes。

p = Path('/etc')    
print(str(p),bytes(p))
#/etc b'/etc'

使用parent獲取父目錄,使用parents獲取所有父目錄,使用absolute方法獲取絕對路徑

p = Path('/a/b/c/d')
p.parent.parent # / PosixPath('/a/b')
p.absolute().parents[len(p.absolute().parents)-1] # PosixPath('/')
print(len(p.absolute().parents)) # 4

獲取文件路徑的方法:
(1)name:目錄的最後一個部分
(2)suffix:目錄中最後一個部分的拓展名
(3)stem:目錄最後一個部分,沒有後綴。
(4)suffixes 返回多個擴展名列表。
(5)with_suffix(suffix):補充擴展名到路徑尾部,返回新的路徑,擴展名存在則無效。
(6)with_name(name):替換目錄最後一個部分並返回一個新的路徑。

p = Path('/etc/config/system/cf.config.gz')
print(p.name)     #cf.config.gz
print(p.suffix)      #.gz
print(p.suffixes)    #['.config', '.gz']
print(p.stem)    #cf.config
print(p.with_name('cf.config')) 
#/etc/config/system/cf.config
print(p.with_suffix('.txt'))
#/etc/config/system/cf.config.txt

4. 文件操作

open(mode=’r’,buffering=-1,encoding=None,errors=None,newline=None):使用方法類似內建函數open,返回一個文件對象。
read_bytes():以’rb’讀取路徑相對文件,並返回二進制流。
read_text(encoding=None,errors=None):以’rt’ 方式讀取路徑對應文件,返回文本。
Path.write_bytes(data):以’wb’方式寫入數據到路徑對應文件。
write_text(data,encoding=None,errors=None):以’wt’方式寫入字符串到路徑對應文件。

p = Path('my_binary_file')
p.write_bytes(b'Binary file contents')
p.read_bytes()
#打印出b'Binary file contents'
p = Path('my_text_file')
p.write_text('Text file contents')
p.read_text()
#打印出'Text file contents'
p = Path('test.py')
p.write_text('hello python')
print(p.read_text())
# hello python
with p.open()as f:
	print(f.read(5))
# hello

5. 文件夾操作

(1)as_uri()將文件路徑返回URI。
(2)mkdir(mode=0o777,parents=False,exist_ok=False)
(3)Parents,是否創建父目錄,True等同於mkdir-p:False時,父目錄不存在,則拋出fileNotfounderror。
(4)exist_ok參數,在3.5版本加入,flase時路徑存在,拋出異常,True時候異常被忽略。
(5)Iterdir():迭代當前目錄
(6)touch(mode=0o666,exist_ok=True)創建一個文件
(7)cwd():返回當前工作目錄
(8)home():返回當前目錄
(9)is_dir():是否是目錄,目錄存在返回True.
(10)is_symlink():是否是軟連接
(11)is_file():是否是普通文件,文件存在返回True
(12)is_socket():是否是socket文件
(13)is_block_device():是否是塊設備。
(14)is_char_device():是否是字符設備
(15)is_absolute():是否是絕對路徑
(16)resolve():返回一個新的路徑,這個新的路徑就是當前Path的絕對路徑,如果是軟連接則直接被解析
(17)absolute()也可以獲取絕對路徑,但是推薦使用resolve()
(18)exists()目錄或文件是否存在
(19)rmdir()刪除空目錄,沒有提供判斷目錄爲空的方法。
(20)ls():獲取所有文件和文件夾

p = Path()
p.exists() # True
p /='a/b/c/d'
p.exists() # False
p.mkdir() # 報錯,創建不成功
p.mkdir(parents=True) # 創建成功
p.exists() # True
p.mkdir(parents=True) # 報錯,已經有了,不能再創建
p.mkdir(parents=True,exist_ok=True) # 不報錯
p /='readme.txt' # p = PosixPath('a/b/c/d/readme.txt')
p.parent.rmdir() # 只剩下PosixPath('a/b/c')
p.parent.exists() # False
p.mkdir() # 報錯,不存在文件
p.mkdir(parents=True) # 成功
for x in p.parents[len(p.parents)-1].iterdir():
    print(x,end='\t')
    if x.is_dir():
        flag = False
        for _ in x.iterdir():
            flag = True
            break
           print('dir','Not Empty' if flag else 'Empyt',sep='\t')
    elif x.is_file():
        print('file')
    elseprint('other file')

6. 通配操作

glob(pattern):通配給定的模式。
rglob(pattern):通配給定的模式,遞歸目錄,返回一個生成器。

list(p.glob('test*')) #返回當前目錄對象下的test開頭的文件
list(p.glob('**/*.py'))#遞歸所有目錄,等同於rglob,會比較費時
g = p.rglob('*.py')  #生成器
next(g)

match(pattern):返回True或False的通配函數。

Path('a/b.py').match('*.py')  #True
Path('/a/b/c.py').match('b/*.py')#True
Path('/a/b/c.py').match('a/*.py') #False    因爲a文件下找不到.Py文件
Path('/a/b/c.py').match('a/*/*.py')#True
Path('/a/b/c.py').math('a/**/*.py')#True
Path('/a/b/c.py').math('**/*.py')#True
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章