1、os.path模块
# os.path常用方法
from os import path p=path.join('/etc','sysconfig','network') # 路径拼接 print(type(p),p) print(path.exists(p)) # 判断路径是否存在 print(path.split(p)) # 将路径切割为2部分,head,tail print(path.abspath('.')) # 当前路径的绝对路径 p=path.join('o:/',p,'test.txt') print(p) # o:/etcsysconfig etwork est.txt print(path.dirname(p)) # o:/etcsysconfig etwork print(path.basename(p)) # test.txt p1=path.abspath(__file__) while p1 != path.dirname(p1): p1=path.dirname(p1) print(p1,path.basename(p1)) ''' 运行结果: F:study-pythoncom.lx.studyweek7 week7 F:study-pythoncom.lx.study com.lx.study F:study-python study-python F: '''
2、pathlib模块
# python3.4版本引入pathlib模块,提供Path对象来操作,包括目录和文件;
# 模块导入: from pathlib import Path
2.1、目录操作
2.1.1、初始化
# 初始化操作:
p=Path() # 创建当前目录对象 ==> “.” p=Path('a','b','c/d') # 当前目录下的a/b/c/d 对象 ==> a/b/c/d p=Path('/etc') # 根下/etc目录对象 ==> /ect
2.1.2、路径的拼接与分解
(1) 拼接操作符:/
# 操作方法:
Path对象 / Path对象;
Path对象 / 字符串 或者 字符串/Path对象;
# 拼接出来的一定是一个Path对象
(2)分解
# Path对象的parts属性,以元祖的形式返回Path对象中的每一个部分;
p=Path('/etc') # 根下/etc目录对象 p=p / 'a' /'c' # Path 对象拼接 print(p) # ==> etcac print(p.parts) # ('\', 'etc', 'a', 'c')
(3)joinpath
# joinpath(*other) 连接多个字符串到Path对象中,返回一个新的路径对象
p = Path() print((p/'a').absolute()) # F:study-pythoncom.lx.studyweek7a p1=p/'a' print(p1.absolute()) p = p / 'a' # a print(0,p.absolute()) print(1,p) p1 = 'b' / p # b/a print(2,p1) p2 = Path('c') # c print(3,p2) p3= p2 /p1 # c / b /a print(4,p3) print(p3.parts) pt=p3.joinpath('etc','init.d',Path('httpd')) print(5,p3) # p3 ==> ca print(6,pt) # pt ==> caetcinit.dhttpd
2.1.3、获取路径
# str方法可以将Path对象转换为字符串对象,bytes获取路径字符串的bytes;
p=Path('/etc') print(str(p)) # etc print(bytes(p)) # b'\etc'
2.1.4、父目录
# p.parent:表示p对象的父目录,p.parents:为整个目录对象的存储元祖
p=Path('a/b/c/d') print(p.parent) # ==> ac print(p.parent.parent) # ==> a print(p.parts) # 父目录元祖 ('a', 'b', 'c', 'd') for x in p.parts: print(x) ''' a b c d '''
2.1.5、目录组成部分
# 目录的组成:name、stem、suffix、suffixes、with_suffix(suffix)、with_name(name)
①:name 目录的最后一部分;
②:suffix 目录中最后一个部分的扩展名;
③:stem 目录最后一个部分,没有后缀;
④:suffixes 返回对个扩展名列表;
⑤:with_suffix(suffix) 有扩展名则替换,无则补充扩展名;
⑥:with_name(name) 替换目录最后一部分并返回一个新的路径;
p=Path('/etc/mysqlinstall/mysql.tar.gz') print(p.name) # ==>mysql.tar.gz print(p.suffix) # ==> .gz print(p.suffixes) # ==> '.tar', '.gz'] print(p.stem) # mysql.tar print(p.with_name('mysql-5.tgz')) # ==> etcmysqlinstallmysql-5.tgz print(p.with_suffix('.png')) # ==> etcmysqlinstallmysql.tar.png p=Path('README.py') # ==> README.py print(p.with_suffix('.txt')) # ==> README.txt
2.1.6、其他用法
''' 全局方法: cwd() 返回当前工作目录 home() 返回当前家目录 判断方法: is_dir() 判断是否为目录 is_file() 判断是否为文件 is_symlink() 判断是否为软链接 is_socket() # 判断是否为socket连接 is_block_device() # 是否为块设备 is_char_device() # 是否为字符设备 is_absolute() # 是否为绝对路径 resolve() # 返回一个新路径,这个路径就是挡墙Path对象的绝对路径,如果是软链接则直接解析; absolute() # 获取绝对路径 exists() # 目录或文件是否存在 rmdir() # 删除空目录,没有提供判断是否为空目录的方法; touch(mode=0o666,exist_ok=True) # 创建一个文件 as_uri() 将路径返回成URI,例如:file:///etc/passwd
p=Path('a.txt')
url=p.absolute().as_uri()
print(url)
==> file:///F:/study-python/com.lx.study/week7/a.txt
mkdir(mode=0o777,parents=False,exist_ok=False) # parents,是否创建父目录,True等同于mkdir -p; False时,父目录不存在,则抛出FileNotFountError # exist_ok参数,False时,路径已经存在则抛出FileExistsError;True则异常被忽略; ''' p=Path('a.txt') p.touch() p1=Path('a/b/c') print(p1.absolute()) p1.mkdir(mode=0o777,parents=True,exist_ok=False) # ==> 在当前目录下创建了a/b/c目录
# iterdir() 迭代当前目录:
p=Path(r'F:study-pythoncom.lx.studyweek7') list=[i for i in p.iterdir()] for i in list: print(i) ''' F:study-pythoncom.lx.studyweek7a F:study-pythoncom.lx.studyweek7a.txt F:study-pythoncom.lx.studyweek7 7file.py '''
# 通配符
glob(pattern) 通配给定的模式;
rglob(pattern) 通配给定的模式,递归目录;
print(list(p.glob('*.py'))) # 返回当前目录对象下以py结尾的文件 ''' ==>[WindowsPath('F:/study-python/com.lx.study/week7/t7file.py')] ''' g=p.rglob('*.txt') # 递归查找txt结尾的文件的生成器对象 for i in g: print(i) ''' F:study-pythoncom.lx.studyweek7a.txt F:study-pythoncom.lx.studyweek7acd eadme.txt
# 匹配 match(pattern)
模式匹配,成功返回True
# stat() 相当于linuxstat命令;
2.2、文件操作
# open(self, mode='r', buffering=-1, encoding=None,errors=None, newline=None):
使用方法类似内建函数open,返回一个文件对象:
p=Path(r'F:study-pythoncom.lx.studyweek7a.txt') print(p.match('*.txt')) with p.open(encoding='utf-8') as f: print(f.readline())
# read_bytes() 以rb模式读取文件,并返回bytes类型
# Path.write_bytes(data) 以wb模式写入数据到文件
# read_text(encoding=None,errors=None) 以rt模式读取文件,返回文本;
# write_text(data,encoding=None,errors=None) 以wt模式写入字符串到文件;