zoukankan      html  css  js  c++  java
  • 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,数字  支持所有数据类型
  • 相关阅读:
    随机数类 Random
    Math 数学类
    Mysql学习总结(16)——Mysql之数据库设计规范
    Mysql学习总结(16)——Mysql之数据库设计规范
    Tomcat学习总结(4)——基于Tomcat7、Java、WebSocket的服务器推送聊天室
    Tomcat学习总结(4)——基于Tomcat7、Java、WebSocket的服务器推送聊天室
    Tomcat学习总结(3)——Tomcat优化详细教程
    Tomcat学习总结(3)——Tomcat优化详细教程
    Hadoop学习总结(2)——Hadoop入门详解
    Spring学习总结(11)——Spring JMS MessageConverter介绍
  • 原文地址:https://www.cnblogs.com/Wj-Li/p/10864917.html
Copyright © 2011-2022 走看看