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","dasc\l"))     #\\\\通过python解释器转义变成\\,\\再通过re转义成\,结果为['c\\l'](因为通过python解释器显示,又转义了一次)
print(re.findall(r"c\\l","dasc\l"))      #加上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

 

posted @ 2020-05-18 16:24  sakura*gyt  阅读(360)  评论(0编辑  收藏  举报