• python基础11--os.re等模块的介绍和应用


    加入新的环境变量:

    import os,sys
    BASE_DIR=os.path.dirname(os.path.dirname(os.path.abspath(__file__)))    #返回当前目录的上1层
    sys.path.append(BASE_DIR)   #把当前目录的上一层加到环境变量中
    View Code

    os模块:

    print(os.getcwd())   #获取当前目录
    os.chdir('..')  #改变当前脚本目录(返回到上一层目录),('.')下一层目录,相当于shell的cd
    os.makedirs('test2/test3')   #生成多层目录
    os.removedirs('test2/test3')   #删除目录,若目录为空则删除,若上一级目录也为空,也删除,以此类推
    os.mkdir('test3')    #生成单极目录
    os.rmdir('test3')    #删除单级目录,若目录不为空则报错
    print(os.listdir('day12'))    #列出指定目录下的所有文件和子目录,包括隐藏文件,以列表方式打印
    os.remove('10.py')   #删除指定文件
    os.rename('12.py','test.py') #重命名文件
    print(os.stat('222.py'))   #获取文件/目录信息
    os.system()  #运行shell命令,直接显示
    os.environ  #获取系统环境变量
    os.path.abspath(path)   #返回path的规范化的绝对路径
    os.path.split(path)  #将path分割成目录和文件名,以元组形式返回
    os.path.dirname(path)  #返回path的目录,即取os.path.split结果中的第一个元素
    os.path.basename(path)  #返回path的文件名,即os。path。split结果中的第二个元素
    os.path.exists(path)  #判断path是否存在,存在则返回True,反之返回False
    os.path.isabs(path)  #判断是否为绝对路径,是返回Ture,否返回False
    os.path.isfile(path)  #如果path是一个存在的文件,返回True,反之返回False
    os.path.isdir(path)   #如果path是一个存在的目录,返回True,反之返回False
    os.path.join(path1,path2...)  #将多个路径组合后返回
    os.path.getatime(path)     #返回path所指文件或目录的最后存取时间
    os.path.getmtime(path)     #返回path所指文件或目录的最后修改时间
    View Code

    sys模块:

    简单的进度条例子:

    import sys,time
    for i in range(20):
        sys.stdout.write('#')
        time.sleep(0.2)     #会缓存完再全部一起显示
        sys.stdout.flush()   #刷新,有多少缓存就显示多少
    View Code

    sys.argv :命令行参数List,第一个元素是程序本身路径

    sys.exit(n):退出程序,正常退出时exit(0)

    sys.version:获取python解释程序的版本信息

    sys.maxint:最大的int值

    sys.path:返回模块的搜索路径

    sys.platform:返回操作系统平台名称

    json模块:

    json.dumps:将数据转化成json字符串      

    json.loads:从json字符串中提取除字符串的数据

    #json能兼容其他语言
    #将字典写进新文件,并使用字典
    import json
    dic={'name':'alex'}
    dic_data=json.dumps(dic)   #变成json字符串,把数据里的‘’先变成“”,然后再‘’将整个数据变成字符串
    f=open("data","w")
    data=f.write(dic_data)
    f_read=open('data',"r")
    result=json.loads(f_read.read())   #相当于eval的作用,提取字符串里的数据
    print(result["name"])
    print(type(result))
    View Code
    import json
    dic={'name':'alex'}
    # f=open("new","w")
    # json.dump(dic,f)     #变成json字符串,并写入文件
    f=open("new","r")
    data=json.load(f)      #读取文件,并提取json字符串内的数据
    print(data["name"])
    View Code

     ps:只要字符串满足json字符串的格式,就能用json的命令,dump和load不一定要配套使用

    import json
    f=open("king","r")     #king文件中的内容为:{"name":"baby"}  如果文件内容为单引号,则不满足json字符串的格式,则报错
    data=json.loads(f.read())
    print(data["name"])
    View Code

    pickle模块:

    与json模块几乎一样,不过dump后的类型为字节,序列后的文件打开看不懂,而且pickle可序列的类型更多

    pickle.dumps  和 pickle.loads

    import pickle
    dic={"name":"baby","old":17,"male":"girl"}
    f=open("pickle_3","wb")     #要注意,一定要进行序列和反序列用wb,rb,因为pickle是以字节的方式存储
    dic_new=pickle.dumps(dic)
    f_write=f.write(dic_new)
    r=open("pickle_3","rb")
    dic_r=pickle.loads(r.read())
    print(dic_r["old"])
    View Code

    shelve模块:

    与json和pickle实现的功能一样,不过逻辑和使用方法不同,shelve一次性生成三个文件,也是看不懂得文件

    import shelve
    f=shelve.open(r'shelve1')      #调用shelve模块,以读的方式打开
    f['stu1']={'name':'alex','age':19}  #直接将字典中的key进行赋值
    f['stu2']={'name':'baby','age':12}
    f['stu3']={'name':'apple','male':"girl"}
    f.close()
    print(f.get('stu3')['male'])   #直接从文件取对应的键
    View Code

    XML模块:

    import xml.etree.cElementTree as ET  #用ET代表xml.etree.cElementTree
    tree=ET.parse('XML_lesson')  #变成一个对象赋值给了tree,注意(对象有属性和调用方法)
    root=tree.getroot()       #获取对象tree的根节点
    print(root.tag)          #获取根节点的标签名字
    
    #遍历xml文档
    for i in root:
        print(i.tag)            #获取根节点下一层根的标签名字
        print(i.attrib)          #获取根节点下一层根标签的属性
    
        for j in i:
            print(j.tag)         #获取根节点下两层根的标签名字
            print(j.attrib)       #获取根节点下两层根标签的属性
            print(j.text)          #获取根节点下两层根的内容
    
    #只遍历某个节点
    for node in root.iter('year'):
        print(node.tag,node.text)      #获取指定节点的标签名称和内容
    
    
    #修改
    for node in root.iter('year'):
        new_node=int(node.text) + 1    #将year的内容变成数字类型再加上1
        node.text=str(new_node)  #将修改结果变成字符串
        node.get("updated","yes")
    tree.write("bbb.xml")
    
    #删除
    for country in root.findall("country"):      #遍历country,findall和find的区别是,findall能寻找多个
        rank=int(country.find('rank').text)       #从country中找到rank的内容
        if rank > 100:
            root.remove(country)
    tree.write("kk.xml")
    View Code

    自主创建xml文档:

    import xml.etree.cElementTree as ET
    new_xml=ET.Element("namelist")   #创建一个根结点,相当于《namelist》《/namelist》
    name=ET.SubElement(new_xml,"name",attrib={'enrolled':'no'}) #创建子节点
    age=ET.SubElement(name,"age",attrib={'check':'no'})
    sex=ET.SubElement(name,"sex")
    sex.text="77"
    name2=ET.SubElement(new_xml,"name2",attrib={'enrolled':"yes"})
    age=ET.SubElement(name2,"age")
    age.text="19"
    et=ET.ElementTree(new_xml)   #生成文档对象
    et.write("test00.xml",encoding="utf-8",xml_declaration=True)
    View Code

    re模块:只能对字符进行处理,用于字符的模糊匹配

    元字符:.(通配符,能匹配很多字符,除了/n)

    import re
    #通配符:. ^ $    * + ? {}(重复就前面紧挨着的字符)
    print(re.findall("a..x","dhasjdhasjahhxdjska"))   #一个.代替任意一个字符
    print(re.findall("^a..x","asdxdhasjdhasjahhxdjska"))   #^代表在字符串开头匹配
    print(re.findall("a..x$","asdxdhasjdhasjahhxdjarrx"))   #$代表在字符结尾匹配
    print(re.findall("alex*","asdxdhasale"))    #贪婪匹配:*代表可以匹配0到无穷次紧挨着的字符 结果为['ale']
    print(re.findall("alex+","sdaasaaale"))     #贪婪匹配:+代表可以匹配1到无穷次紧挨着的字符   结果为[]
    print(re.findall("alex?","sdaasaaalex"))     #贪婪匹配;?代表可以匹配0或1次紧挨着的字符   结果为[‘alex’]
    print(re.findall("alex{0,7}","sdaasaaalexxx"))   #贪婪匹配:{}是万能的,能自定义取范围和具体值的次数。
    print(re.findall("alex*?","sdaasaaalexxx"))     #在贪婪匹配的字符后面加上?,即变成惰性匹配
    
     #通配符:[]字符集
    print(re.findall("q[d*s]","sqsdhjq*sjd"))     #[]表示字符集,或的关系,在字符集里,以上的元字符都只是普通符号,没有实际意义,只有 -,^, 有实际意义
    print(re.findall("q[a-z]","sqsdhjqasjd"))     #-代表范围的意思,结果为['qs', 'qa']
    print(re.findall("q[a-z]*","sqsdhjqasjd9"))    #加入*代表匹配0到无穷次a-z范围的字符 ,结果为['qsdhjqasjd']
    print(re.findall("q[0-9]*","sq123ss342sdhjqasjd9"))   #结果为['q123', 'q']
    print(re.findall("q[^a-z]*","sqsdhjq123asq**jd9"))     #字符集里面的^代表非得意思,结果为['q', 'q123', 'q**']
    #应用:取公式内最先计算得括号内容
    print(re.findall("([^()]*)","23+(36*5-5-5*(3-2))"))     #后面跟元字符,去除特殊意义,结果为['(3-2)']
    
    # 转义字符后面跟普通字符,能实现特殊功能,例如如下:
    print(re.findall("d","23+(36*5-5-5*(3-2))"))     #d表示匹配任何十进制的数,相当于【0-9】,结果为['2', '3', '3', '6', '5', '5', '5', '3', '2']
    print(re.findall("d+","23+(36*5-5-5*(3-2))"))    #至少匹配一个数字,结果为['23', '36', '5', '5', '5', '3', '2']
    print(re.findall("D+","23+(36*5-5-5*(3-2))"))    #取相反结果,结果为['+(', '*', '-', '-', '*(', '-', '))']
    print(re.findall("s","hello girl"))       #s表示匹配任何空白字符
    print(re.findall("S+","hello girl"))       #S表示匹配任何非空白字符 结果为['hello', 'girl']
    print(re.findall("w+","sadd090ZDH"))       #w表示匹配任何字母和数字字符,相当于【a-z,A-Z,0-9】,结果为['sadd090ZDH']
    print(re.findall("W","sadd090ZDH  #$$"))       #w表示匹配任何非字母和数字字符,结果为[' ', ' ', '#', '$', '$']
    
    #转义字符的使用
    print(re.findall("c\\l","dascl"))     #\\通过python解释器转义变成\,\再通过re转义成\,结果为['c\l'](因为通过python解释器显示,又转义了一次)
    print(re.findall(r"c\l","dascl"))      #加上r,不通过python解释器转义,结果同上
    
    #|管道符的使用
    print(re.findall(r"daa|kbb","sdaafdfkbb"))    #管道符表示或的意思,分开成两个整体,结果为['daa', 'kbb']
    
    #()分组符的使用
    print(re.findall(r"(abc)+","abcaaaa"))     #将abc作为一个分组进行匹配
    print(re.search("d+","abc123gsfa23"))     #search找到一个匹配的值就会停止,返回一个对象,结果为<_sre.SRE_Match object; span=(3, 6), match='123'>
    print(re.search("d+","abc123gsfa23").group())    #调用search的对象要用group,结果为123
    print(re.search("(?P<name>[a-z]+)d+","alex23apple33baby45").group())    #也是分组的另一种形式,把匹配的内容做成name的分组,固定写法,,结果为alex23
    print(re.search("(?P<name>[a-z]+)d+","alex23apple33baby45").group("name"))   #分组后,能把分组的信息单独拿出来,结果为alex
    print(re.search("(?P<name>[a-z]+)(?P<age>d+)","alex23apple33baby45").group("age"))  #结果为23
    
    
    #re模块的方法
    #findall:把所有符合匹配的值放入一个列表
    #search:找到符合匹配的第一个值并返回一个对象,通过调用group方法得到匹配到的值
    #match:与search几乎一样,不过是在字符串开头匹配,相当于加了^的search
    #split:按指定字符进行分割
    print(re.split("[ |]","hello i am|lisa"))   #结果为['hello', 'i', 'am', 'lisa']
    print(re.split("[ab]","adsbdabdjfdk"))    #结果为['', 'ds', 'd', '', 'djfdk']
    #sub:进行替换
    print(re.sub("d","A","sdad1222fd213f4444f"))   #结果为sdadAAfdsfAAAAf,还能加入一个数字参数,表示替换指定次数
    print(re.sub("d+","A","g12d344df55gf78"))   #结果为gAdAdfAgfA
    print(re.subn("d","A","sdad12fdsf4444f"))      #结果为('sdadAAfdsfAAAAf', 6)
    #compile:编译,可用多次
    com=re.compile("d+")     #
    print(com.findall("sa23dfs44"))
    #finditer:与findall一样,不过是把匹配的结果封装到迭代器里,节省内存
    ret=re.finditer("d+","sa23dfs44")   #结果为<callable_iterator object at 0x0000027BD0D33978>
    print(next(ret).group())    #因为next后得结果是对象,所以还得调用group,结果为23
    #?:去优先级
    print(re.findall("www.(baidu|163).com","sadjsawww.163.com"))    #优先显示分组内容,结果为['163']
    print(re.findall("www.(?:baidu|163).com","sadjsawww.163.com"))   #结果为['www.163.com']
    #补充:
    print(re.findall(r"(abc)+","abcabcabc"))     #将abc作为一个分组进行匹配,分组后会优先显示分组内容,结果为['abc']
    print(re.findall(r"(?:abc)+","abcabcabc"))  #去优先级,即可得到匹配结果,结果为['abcabcabc']
    View Code
  • 相关阅读:
    vim 高级使用技巧第二篇
    你所不知道的Html5那些事(一)
    linux设备驱动第三篇:如何实现一个简单的字符设备驱动
    Android Metro风格的Launcher开发系列第二篇
    「BZOJ3123」[SDOI2013]森林
    【模板】左偏树
    「luogu3157」[CQOI2011]动态逆序对
    「luogu3567」[POI2014]KUR-Couriers
    【模板】二逼平衡树
    「luogu3313」[SDOI2014]旅行
  • 原文地址:https://www.cnblogs.com/sakura-gyt/p/12893354.html
Copyright © 2020-2023  润新知