路径操作模块
3.4版本之前
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 from os import pathp = path.join('/etc' ,'sysconfig' ,'network' ) print (type (p),p)print (path.exists(p)) print (path.split(p)) print (path.abspath('.' ))p = path.join('o:/' ,p,'test.txt' ) print (path.dirname(p))print (path.basename(p))print (path.splitdrive(p))p1 = path.abspath(__file__) print (p1,path.basename(p1))while p1 ~= path.dirname(p1): p1 = path.dirname(p1) print (p1,path.basename(p1))
3.4版本开始 建议使用pathlib模块,提供Path对象来操作。包括目录和文件。
pathlib模块 from pathlib import Path
目录操作 初始化
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 p = Path() type (p)p = Path('a' ,'b' ,'c/d' ) p = Path('/etc' ) p.absolute() p = p.joinpath('a' ,'b' ) p.absolute() p = p / 'c' / 'd' p p /= 'e' p1 = Path('/etc' ) p1.absolute() p2 = '/' / 'etc' / 'sysconfig' p2 = Path('' ) p2 = '/etc' / 'sysconfig' p2 = p2 / '/etc' / 'sysconfig' p2.parts p2.joinpath('a/b' ,'c' ) str (p2)bytes (p2)p2.parent p2.parent.parent list (p2.parents)p2 /= 'a/b/c/d' list (p2.parents)next (iter (p2.parents))
路径拼接和分解
操作符/
Path对象 / Path对象
Path对象 / 字符串 或者 字符串 / Path对象
分解
parts属性,可以返回路径中的每一个部分
joinpath
joinpath(*other)
连接多个字符串到Path对象中
1 2 3 4 5 6 7 p = Path() p = p / 'a' p1 = 'b' / p p2 = Path('c' ) p3 = p2 / p1 print (p3.parts)pe.joinpath('etc' ,'init.d' ,Path('httpd' ))
获取路径
str 获取路径字符串
bytes 获取路径字符串的bytes
1 2 p = Path('/etc' ) print (str (p),bytes (p))
父目录
parent 目录的逻辑父目录
parents 父目录序列,索引0是直接的父
1 2 3 4 p = Path('/a/b/c/d' ) print (p.parent.parent)for x in p.parents: print (x)
name、stem、suffix、suffixes、with_suffix(suffix)、with_name(name)
name:目录的最后一个部分
suffix:目录中最后一个部分的扩展名
stem:目录最后一个部分,没有后缀
suffixes:返回多个扩展名列表
with_suffix(suffix):补充扩展名到路径尾部,返回新的路径,扩展名存在则无效
with_name(name):替换目录最后一个部分并返回一个新的路径
Path的方法拿到的大多数是对象,所以可以使用对象的方法拼接路径,这更方便。返回对象后方便对前面的结果继续处理,如使用p2.parent.parent
1 2 3 4 5 6 7 8 p = Path('/magedu/mysqlinstall/mysql.tar.gz' ) print (p.name)print (p.suffix)print (p.suffixes)print (p.stem)print (p.with_name('mysql-5.tgz' ))p = Path('README' ) print (p.with_suffix('.txt' ))
cwd():返回当前工作目录
home():返回当前家目录
is_dir():是否是目录,目录存在返回True
is_file():是否是普通文件,文件存在返回True
is_symlink():是否是软链接
is_socket():是否是socket文件
is_block_device():是否是块设备
is_char_device():是否是字符设备
is_absolute():是否是绝对路径
resolve():返回一个新的路径,这个新路径就是当前Path对象的绝对路径,如果是软链接则直接被解析
absolute():也可以获取绝对路径,但是推荐使用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():迭代当前目录
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 p = Path() p /= 'a/b/c/d' p.exists() p.mkdir() p.mkdir(parents=True ) p.exists() p.mkdir(parents=True ) p.mkdir(parents=True ,exist_ok=True ) p /= 'readme.txt' p.parent.rmdir() p.parent.exists() p.mkdir() p.mkdir(parents=True ) 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' ,'Not Empth' if flag else 'Empyt' ,sep='\t' ) elif x.is_file(): print ('file' ) else : print ('other file' )
通配符 glob(pattern):通配给定的模式
rglob(pattern):通配给定的模式,递归目录
1 2 3 4 5 6 list (p.glob('test*' )) list (p.glob('**/*.py' )) g = p.rglob('*.py' ) next (g)
匹配 match(pattern):模式匹配,成功返回True
1 2 3 4 5 6 Path('a/b.py' ).match ('*.py' ) Path('/a/b/c.py' ).match ('b/*.py' ) Path('/a/b/c.py' ).match ('a/*.py' ) Path('/a/b/c.py' ).match ('a/*/*.py' ) Path('/a/b/c.py' ).match ('z/**/*.py' ) Path('/a/b/c.py' ).match ('**/*.py' )
stat():相当于stat命令
lstat()同stat(),但如果是符号链接,则显示符号链接本身的文件信息
1 2 3 4 5 6 7 $ ln -s test t from pathlib import Pathp = Path('test' ) p.stat() p1 = Path('t' ) p1.stat() p1.lstat()
文件操作 open(mode='r',buffering=-1,encoding=None,errors=None,newline=None)
使用方法类似内奸函数open。返回一个文件对象
3.5增加的新函数
read_bytes():以’rb’读取路径对应文件,并返回二进制流。看源码
read_text(encoding=None,errors=None):以’rt’方式读取路径对应文件,返回文本
Path.write_bytes(data):以’wb’方式写入数据到路径对应文件
write_text(data,encoding=None,errors=None):以’wt’方式写入字符串到路径对应文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 p = Path('my_binary_file' ) p.write_bytes(b'Binary file contents' ) p.read_bytes() p = Path('my_text_file' ) p.write_text('Text file contents' ) p.read_text() from pathlib import Pathp = Path('o:test.py' ) p.write_text('hello python' ) print (p.read_text())with p.open () as f: print (f.read(5 ))