路徑操作模塊
3.4版本之前
- os.path模塊
from os import path p = path.join('/etc', 'sysconfig', 'network') print(type(p), p) print(path.exists(p)) print(path.split(p)) print(path.abspath('.')) p = path.join('d:/', p, 'test.txt') path.dirname(p) path.basename(p) path.splitdrive(p)
3.4版本之后
建議使用pathlib模塊,提供Path對象來操作。包括目錄和文件
pathlib模塊
- from pathlib import Path
目錄操作
初始化
p = Path()
p = Path('a', 'b', 'c/d')
路徑拼接和分解
- 操作符
Path對象 / Path對象 Path對象 / 字符串 或者 字符串 / Path對象
- 分解
- parts屬性,可以返回路徑中的每一個部分
-
- joinpath(*other)
- 連接多個字符串到Path對象中joinpath
獲取路徑
- str ? 獲取路徑字符串
- bytes ? 獲取路徑字符串的bytes
父目錄
- parent ? 目錄的邏輯父目錄
- parents ? 父目錄序列,索引父,其他是爺爺輩
name、stem、suffix、suffixes、with_suffix(suffix)、with_name(name)
- name ? 目錄的最后一個部分
- suffix ? 目錄中最后一個部分的擴展名(后綴)
- stem ? 目錄最后一個部分,沒有后綴
- suffixes ? 返回多個擴展名列表
- with_suffix(suffix) ? 補充擴展名到路徑尾部,返回新的路徑,擴展名存在則無效
- p.with_suffix(‘.txt’),txt前必須有點,否則會報錯
- with_name(name) ? 替換目錄最后一個部分,并返回一個新的路徑
其他操作
- cwd()
- 返回當前工作目錄
- home()
- 返回當前家目錄
- is_dir()
- 是否是目錄
- is_file()
- 是否是文件
- is_symlink()
- 是否是軟鏈接
- is_socket()
- 是否是socket文件
- is_block_device()
- 是否是塊設備
- is_char_device()
- 是否是字符設備
- is_absolute()
- 是否是絕對路徑
- resolve()
- 返回一個新的路徑,這個新路徑就是當前Path對象的絕對路徑,如果是軟鏈接則直接被解析
- absolute()
- 也獲取絕對路徑,但是推薦使用resolve()
- exists()
- 目錄或文件是否存在
- rmdir()
- 刪除空目錄,幾乎不用
- touch(mode=0o666, exist_ok=True)
- 創建一個文件
- as_uri()
- 將路徑返回成URI,例如
'file:///etc/passwd'
- 將路徑返回成URI,例如
- mkdir(mode=0o777, parents=False, exist_ok=False)
- parents,是否創建父目錄
- True,等同于
mkdir -p
- False,父目錄不存在,則拋出FileNotFoundError
- True,等同于
- exist_ok
- 在3.5版本加入
- False,路徑存在,拋出FileExistsError
- True,FileExistsError被忽略
- parents,是否創建父目錄
- 迭代當前目錄iterdir()
p /= 'a/b/c/d'
等價于p = p / 'a/b/c/d'
- 遍歷,并判斷文件類型,如果是目錄,判斷其是否為空
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 'Empty',sep='\t') elif x.is_file(): print('file') else: print('other file')
通配符
- glob(pattern) ? 通配給定的模式
- rglob(pattern) ? 通配給定的模式,遞歸目錄
p = Path('d:/test')p.glob('p*') # 生成器list(p.glob('p*')) # 返回當前目錄對象下的p開頭的文件list(p.glob('*/p*')) # 返回當前目錄的下一級目錄對象下的p開頭的文件list(p.glob('**/p*'))# 遞歸所有目錄,等同rgloblist(p.rglob('*p'))
- 返回當前目錄的下一級目錄對象下的p開頭的文件
- 返回當前目錄的下一級目錄對象下的p開頭的文件
匹配
- match(pattern)
- 模式匹配,成功返回True
文件操作
- Path.open(self, mode=’r’, buffering=-1, encoding=None, errors=None, newline=None)
- 使用方法類似內建函數open,返回一個文件對象
-
- read_bytes()
- 以
rb
讀取路徑對應文件,返回二進制流
- 以
- read_text(encoding=None, errors=None)
- 以
rb
讀取路徑對應文件,返回二進制流
- 以
- Path.write_bytes(data)
- 以
wb
方式寫入數據到路徑對應文件
- 以
- write_text(data, encoding=None, errors=None)
- 以
wb
方式寫入數據到路徑對應文件
- 以
- 上面的可以看源碼理解,有時候比看幫助文件簡單3.5新增加的函數
from pathlib import Path p = Path('d:/test.py') p.write_text('hello everyone') print(p.read_text()) with p.open() as f: print(f.read(5))
- read_bytes()
本文來自投稿,不代表Linux運維部落立場,如若轉載,請注明出處:http://www.www58058.com/88093