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对比
json pickle
支持所有的编程语言 只支持python
支持数据类型只有str,dict,list,数字  支持所有数据类型
原文地址:https://www.cnblogs.com/Wj-Li/p/10864917.html