加入新的环境变量:
import os,sys BASE_DIR=os.path.dirname(os.path.dirname(os.path.abspath(__file__))) #返回当前目录的上1层 sys.path.append(BASE_DIR) #把当前目录的上一层加到环境变量中
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所指文件或目录的最后修改时间
sys模块:
简单的进度条例子:
import sys,time for i in range(20): sys.stdout.write('#') time.sleep(0.2) #会缓存完再全部一起显示 sys.stdout.flush() #刷新,有多少缓存就显示多少
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))
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"])
ps:只要字符串满足json字符串的格式,就能用json的命令,dump和load不一定要配套使用
import json f=open("king","r") #king文件中的内容为:{"name":"baby"} 如果文件内容为单引号,则不满足json字符串的格式,则报错 data=json.loads(f.read()) print(data["name"])
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"])
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']) #直接从文件取对应的键
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")
自主创建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)
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']