python之路径操作
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))