python常用模块续
os模块
os模块是操作系统交互模块
os模块中的各种常用方法:
os.remove('文件名') 删除指定文件
os.rename('旧文件名','新文件名') 更改一个文件的文件名
os.mkdir('dirname') 创建一个文件夹
os.rmdir('dirname') 删出单级目录,若此目录不为空,则无法删除
os.makedirs('dir1/dir2/dir3') 生成多级递进目录
os.removedirs('dir1/dir2/dir3') 删除多层目录,从内到外,如果遇到不为空的目录,则停止删除
os.listdir('dirname') 列出指定目录下的所有文件和子目录,包括隐藏文件,并返回一个列表
os.path.join('绝对路径','文件名或文件夹') 拼接目录
os.path.isfile() 判断是否为文件
os.path.isdir() 判断是否为文件夹
os.path.split() 将path分割成目录和文件名,按元组返回
os.path.dirname() 获取当前文件所在目录的绝对路径 即os.path.split()的结果的第一个元素
os.path.getsize() 获取文件大小
print(__file__) 获取当前文件的绝对路径
os模块其他方法:
os.popen() 执行操作系统命令,并返回结果
os.path.abspath() 返回path规范化路径
os.path.getatime() 返回path所指向的文件或目录的最后访问时间(时间戳)
os.path.getmtime() 返回path指向的文件或目录的最后修改时间(时间戳)
os.stat('file/filename') 获取文件/目录信息的结构说明
re模块
与正则表达式匹配相关
认识正则表达式:
正则表达式是客观存在的概念,并不依赖与python语言本身
re模块的常用方法
re.findall('正则表达式','带匹配字符') 返回列表,所有符合项 特点:会出现优先显示分组内容,在分组的第一个 '(' 后面加?:可以取消
re.search('正则表达式','带匹配字符') 从左到右找到第一个符合条件的内容就返回 返回的结果用.group()取结果
group(n)可以去分组中的内容
re.match('正则表达式','带匹配字符') 默认给正则表达式前加‘^’ 其他与search相同
re.compile('正则表达式') 编译正则表达式为字节码
使用方法:
import re
ret = re.compile('\d+')
res = ret.findall('123456789')
#多次执行同一个正则表达式的时候,compile事先编译正则表达式为字节码,效率更高
re.finditer('正则表达式','带匹配字符') 返回一个存放结果的迭代器
使用re模块实现类似计算器的功能(支持加减乘除)
'''
实现能计算类似
1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )
等类似公式的计算器程序
'''
import re
equ = '1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )'
equ1 = '1+2+3+4*(6/2)'
def calculator(equ):
equ = equ.replace(' ','')
while True:
if '+'in equ or '-'in equ or '*'in equ or '/'in equ:
ret_list = re.findall('\([^()]+\)',equ) #找出内部没有小括号的算式 (-40/5)
for ret1 in ret_list:
for i in range(ret1.count('*')+ret1.count('/')): #查找次数
ret2 = re.search('\d+(\.\d+)?[*/]-?\d+(\.\d+)?',ret1)#获取内部没有括号的式子中的第一个乘法或除法
ret3 = ret2.group()
if '/' in ret3:
num1,num2 = ret3.split('/')
equ = equ.replace(ret3,str(float(num1)/float(num2)))
ret1 = ret1.replace(ret3,str(float(num1)/float(num2)))
elif '*' in ret3:
num1,num2 = ret3.split('*')
equ = equ.replace(ret3,str(float(num1)*float(num2)))
ret1 = ret1.replace(ret3,str(float(num1)*float(num2)))
ret_list = re.findall('\([^()]+\)',equ) #找出内部没有小括号的算式
for ret in ret_list: #'(60-30+-1388367.0476190478)'
for i in range(ret.count('+')+ret.count('-')): #查找次数
ret1 = re.search(r'-?\d+(\.\d+)?[+-]\d+-*?(\.\d+)?',ret) #遇到'--'坑 *?改成非贪婪匹配
if ret1 is not None:
ret2 = ret1.group()
if '+' in ret2:
num1,num2 = ret2.split('+')
equ = equ.replace(ret2,str(float(num1)+float(num2)))
ret = ret.replace(ret2,str(float(num1)+float(num2)))
elif '-' in ret2:
num1,num2 = ret2.split('-')
equ = equ.replace(ret2,str(float(num1)-float(num2)))
ret = ret.replace(ret2,str(float(num1)-float(num2)))
ret1_list = re.findall(r'\(-?\d+(?:\.\d+)?\)',equ) #找到带括号的数字
for ret in ret1_list:
ret1 = ret.replace('(','') #去括号
ret2 = ret1.replace(')','')
equ = equ.replace(ret,ret2)
if '+-' in equ:
equ = equ.replace('+-','-')
elif '--'in equ:
equ = equ.replace('--','+')
if '('not in equ and ')'not in equ: #此时算式中没有括号了
for i in range(equ.count('*')+equ.count('/')):
ret = re.search('\d+(\.\d+)?[*/]-?\d+(\.\d+)?',equ)
if ret is not None:
ret1 = ret.group()
if '*' in ret1:
num1,num2 = ret1.split('*')
equ = equ.replace(ret1,str(float(num1)*float(num2)))
if '/' in ret1:
num1,num2 = ret1.split('/')
equ = equ.replace(ret1,str(float(num1)/float(num2)))
if '+-' in equ: #乘法和除法算完可能会有'+-'和'--'出现
equ = equ.replace('+-','-')
elif '--'in equ:
equ = equ.replace('--','+')
for i in range(equ.count('+')+equ.count('-')):
ret = re.search('\d+(\.\d+)?[+-]-?\d+(\.\d+)?',equ)#此时只剩下加减法了
if ret is not None:
ret1 = ret.group()
if '+' in ret1:
num1,num2 = ret1.split('+')
equ = equ.replace(ret1,str(float(num1)+float(num2)))
if '-' in ret1:
num1,num2 = ret1.split('-')
equ = equ.replace(ret1,str(float(num1)-float(num2)))
else:
return equ
print(calculator(equ)) #equ代表是要计算的算式
json模块 又叫序列化模块
json.dumps() 其他数据类型 ---> 序列化(dumps)--->字符串
json.loads() 字符串 ---> 反序列化(loads)---> 其他数据类型
例:
import json
menu = {'key':'value','k':'v'}
ret = json.dumps(menu)
print(ret)
res = json.loads(ret)
print(res)
dump/load 和文件打交道
import json
menu = {'key':'value','k','v'}
with open('filename','w') as f:
json.dump(menu,f) #把menu序列化的结果直接写进'filename'中
with open('filename','r') as f:
ret = json.load(f)
print(ret)
pickle 另一个序列化模块
import pickle
menu = {'key':'value','k':'v'}
ret = pickle.dumps(menu)
print(ret)
res = pickle.loads(ret)
print(res)
pickle 的 dump/load和json的用法相同。
看了上边的json 和 pickle 机智的你发现了这俩不就是名字不一样吗,用法简直不要一模一样好不好...
不急,马上给你指点他俩的不同之处
json和pickle对比
json | pickle |
支持所有的编程语言 | 只支持python |
支持数据类型只有str,dict,list,数字 | 支持所有数据类型 |