python在3.4版本以前,傳統做法
python
os.path模塊mysql
from os import path p = path.join('/etc', 'sysconfig', 'network')# 路徑拼接 print(type(p), p) # <class 'str'> /etc/sysconfig/network print(path.exists(p))# 路徑是否存在(True or False) print(path.split(p))# (head, tail)---->('/etc/sysconfig', 'network') print(path.abspath("."))#/home/python/data/project/cmdb print(path.dirname(p))#/etc/sysconfig print(path.basename(p))#network print(path.splitdrive(p))# 在windows系統下用,能夠把磁盤驅動器拿出來
3.4版本開始,建議使用pathlib模塊,提供Path對象來操做。包括目錄和文件。
linux
from pathlib import Path p = Path() #初始化 PosixPath('.') type(p)# pathlib.PosixPath #linux和windows系統是不一樣的; p.joinpath('a/b')#PosixPath('a/b') p.absolute()#PosixPath('/home/python/data/project/cmdb') #這裏爲何顯示不出來a/b??? p = p.joinpath('a/b') #建立便可; p.absolute()#PosixPath('/home/python/data/project/cmdb/a/b')
In [9]: p = p/ 'c' / 'd' In [10]: p Out[10]: PosixPath('a/b/c/d') In [11]: p.absolute() Out[11]: PosixPath('/home/python/data/project/cmdb/a/b/c/d') In [12]: p /= 'e'/'f' --------------------------------------------------------------------------- TypeError Traceback (most recent call last) <ipython-input-12-ef914be1dfd6> in <module> ----> 1 p /= 'e'/'f' TypeError: unsupported operand type(s) for /: 'str' and 'str' In [13]: p = p / 'e'/'f'
路徑拼接和分解sql
操做符/windows
Path對象 / Path對象
socket
Path對象 / 字符串 或者 字符串/Path對象ide
分解函數
parts屬性, 能夠返回路徑中的每個部分;spa
p2 = Path('/etc','sysconfig','network') p2.parts# ('/', 'etc', 'sysconfig', 'network')
獲取路徑對象
str獲取路徑字符串
bytes獲取路徑字符串的bytes
p = Path('/etc') print(str(p), bytes(p)) #/etc b'/etc'
父目錄
parents 父目錄序列,索引0是直接的父;
p2.parent #PosixPath('/etc/sysconfig') p2.parents# <PosixPath.parents> list(p2.parents)#[PosixPath('/etc/sysconfig'), PosixPath('/etc'), PosixPath('/')] list(p2.parents)[0]# PosixPath('/etc/sysconfig')
name 目錄的最後一個部分
suffix目錄中最後一個部分的擴展名
stem目錄最後一個部分,沒有後綴
suffixes 返回多個擴展名列表
with_suffix(suffix)補充擴展名到路徑尾部,返回新的路徑,擴展名存在則無效;
with_name(name) 替換目錄最後一個部分並返回一個新的路徑 ;
from pathlib import Path p = Path('a/b/c/d') print(p.name) p1 = Path('/etc/sysconfig/network/xx.ifg') print(p1.suffix) print(p1.stem) p2 = Path(str(p1) + '.gz') print(p2.suffixes) p3 = p1.with_suffix('.tgz') print(p3) p4 = p2.with_name(p1.name) print(p4)
cwd() 返回當前工做目錄 ;
home()返回當前家目錄;
is_dir() 是不是目錄;
is_file()是不是普通文件;
is_symlink()是不是軟連接
is_socket()是不是socket文件
is_block_device()是不是塊設備
is_char_device()是不是字符設備
is_absolute() 是不是絕對路徑
resolve()返回一個新的路徑,這個新路徑就是當前Path對象的絕對路徑,若是是軟連接則直接被解析;
basolute()也能夠獲取絕對路徑,可是推薦使用resolve()
exists() 目錄或文件是否存在;
rmdir()刪除空目錄。沒有提供判斷目錄爲空的方法。
touch(mode=0o666, exist_ok=True) #建立一個文件
as_uri() 將路徑返回成URI,例如'file:///etc/passwd'
mkdir(mode=0o777, parents=False, exist_ok=False):
parents是否建立父目錄,True等同於mkdir -p;false時,父目錄不存在,則拋出FileNotFoundError
exist_ok參數,在3.5版本加入,false時,路徑存在,拋出FileExistsError; True時 ,FileExistsError被忽略;
iterdir() 迭代當前目錄
for x in Path().iterdir(): if x.is_dir(): print(x)
#遍歷,並判斷文件類型,如是是目錄判斷其是否爲空;
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', 'NotEmpty' if flag else 'Empty', sep='\t') elif x.is_file(): print( 'symlink file' if x.is_symlink() else 'file') else: print('other file')
glob(pattern)通配給定的模式
rglob(pattern) 通配給定的模式,遞歸目錄;
list(Path().glob('test*'))# 返回當前目錄對象下的全部test開頭的文件 list(Path().glob("**/*.py"))# 等同於rglob, 遞歸全部目錄 list(Path().rglob("*.py"))
匹配:
match(pattern)模式匹配,成功返回True
Path('a/b/c.py').match('*.py') Path('a/b/c.py').match("a/*/*.py") Path('a/b/c.py').match("**/*.py")
文件操做
open(mode='r', buffering=-1, encoding=None, errors=None, newline=None)
使用方法相似內建函數open,返回一個文件對象
python 3.5之後新增長方法:
write_text() write_bytes() 慎用,由於每次都會把原文件清空,至關於open('w')能夠查看源碼看一下;
read_text() read_bytes()
p = Path('/tmp/mysql') p.touch() with p.open('w') as f: pass
p.write_text("python") p.read_text() 'python'
p = Path("/tmp/test.py") p.write_text("hello python") print(p.read_text()) with p.open() as f: print(f.read(5))