python在3.4版本之前,传统作法

os.path模块

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工具来操作。包罗目录和文件。

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'

路径拼接和剖析


操作符/

    Path工具 / Path工具

    Path工具 / 字符串 或者  字符串/Path工具


剖析

    parts属性, 可以返回路径中的每一个部门;

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))