python在3.4版本之前,传统作法
os.path模块
from os import path
p = path.join('/etc', 'sysconfig', 'network')# 路径拼接
print(type(p), p) # /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)
in
----> 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#
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))