python之路径操作

  |   0浏览


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

os.path模块

from os import pathp = path.join('/etc', 'sysconfig', 'network')# 路径拼接print(type(p), p) # <class 'str'> /etc/sysconfig/networkprint(path.exists(p))# 路径是否存在(True or False)print(path.split(p))# (head, tail)---->('/etc/sysconfig', 'network')print(path.abspath('.'))#/home/python/data/project/cmdbprint(path.dirname(p))#/etc/sysconfigprint(path.basename(p))#networkprint(path.splitdrive(p))# 在windows系统下用,可以把磁盘驱动器拿出来


3.4版本开始,建议使用pathlib模块,提供Path对象来操作。包括目录和文件。

from pathlib import Pathp = 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 Pathp = 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))

原文地址:https://blog.51cto.com/limingyu/2507755