python之路徑操做



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))
相關文章
相關標籤/搜索