一、上堂回顾
1.默写题目
1.自定义一个异常,抛出异常对象并捕获
#1.自定义一个类,继承自Exception class CustomException(Exception): #2.书写构造函数,调用父类的构造函数【将系统的异常机制继承】 def __init__(self,msg): super(CustomException,self).__init__() self.msg = msg #3.重写__str__函数 def __str__(self): return self.msg #4.定义一个成员函数,处理异常 def handle(self): pass #6.捕获:为了后面的代码能够正常运行 try: #5.抛出异常 raise 异常对象 raise CustomException("自定义异常") except CustomException as e: print(e) e.handle()
2.实现一个.txt文件内容的拷贝
import os path1 = "" path2 = "" #1.打开文件 f1 = open(path1,"rb") f2 = open(path2,"wb") #2.读取并且写入 #获取源文件的大小 size = os.path.getsize(path1) #循环读取文件,直到将所有的内容全部读取完毕 size = 0 while size > 0: content = f1.read(1024) f2.write(content) f2.flush() size -= 1024 #3.关闭文件 f1.close() f2.close()
2.上堂回顾
3.作业讲解
3.1邮编查询
""" 2、邮编查询 查到返回对应的城市 否则提示无此邮编 """ num = input("请输入邮编") path = "youbian.txt" f = open(path,"r",encoding="utf-8") result = f.readline() while result: newStr = result[1:] if newStr.startswith(num): print(result[9:-4]) break result = f.readline()
3.2开房记录查询
""" 3、开房查询 输入名字,查询其开房记录,如果没有,是一个单纯哥们,如果有的话,将其所有开房信息写入到以这哥们命名的文件中 """ import os #1.读取文件 def loadFile(path): f = open(path,"r",encoding="utf-8") #返回值为一个列表 l = f.readlines() f.close() return l #2.查询 def search(list1,name): #定义一个新的列表,用于保存能够查找到的人的信息 subList = [] #遍历原列表,获取每一条信息 for line in list1: infoList = line.split(",") #查询 if name == infoList[0]: #将查询到的数据添加到subList中 subList.append(line) """ 如果查询到数据,则返回一个有信息的列表 如果查询不到数据,则返回一个空列表 """ return subList if __name__ == "__main__": path = "kaifanglist.txt" #调用读取数据的函数,返回的是所有的信息 allList = loadFile(path) while True: name = input("请输入要查找的人的姓名【输入q退出】:") if name == "q": break else: #调用查找的函数 singleList = search(allList,name) if singleList: print(name + "果然去开房了") #将singleList中的信息写入到一个新的文件中 f = open(name + ".txt","a",encoding="utf-8") #遍历列表,将查询到的数据写入到文件中 for row in singleList: f.write(row) f.flush() #关闭文件 f.close() print("数据提取成功") else: print("他是个好人,好好珍惜吧")
二、csv文件读写
1.概念
csv:Comma Separated Values 逗号分隔值
.csv是一种文件格式【txt,doc】,是一种特殊的文本格式【一组字符序列,字符之间使用逗号或者使用制表符隔开】
作用:纯文本文件,存储数据,可以在不同的程序之间进行数据的交互
打开方式:记事本,excel
2.读取csv文件
代码演示:
#一.导入模块csv import csv #二.三步读取 def readCsv1(path): #1.打开文件 f = open(path,"r") #2.获取迭代类型【将打开的文件对象转换为一个可迭代对象】 read = csv.reader(f) #f.read(path) print(type(read)) #3.遍历可迭代对象 infoList = [] for item in read: print(item) infoList.append(item) #infoList就是一个二维列表 #3.关闭文件 f.close() return infoList path = r"person.csv" print(readCsv1(path)) #三。简写形式 def readCsv2(path): infoList = [] with open(path,"r") as f: read = csv.reader(f) for item in read: print(item) infoList.append(item) return infoList
3.向csv文件写入
代码演示:
#一.导入模块csv import csv #二、从列表写入csv def writeCsv1(path): infoList = [['username', 'password', 'age', 'address'], ['zhangsan', 'abc123', '10', 'China'], ['lisi', 'aaa123', '18', 'xian']] #1.打开文件 csvFile1 = open(path,"w",newline="") #默认每一行的后面会出现一个空行,如果想要取消,则设置newline="" #2.将文件对象转换为可迭代对象 writer1 = csv.writer(csvFile1) #f.write("") #3.将列表中的数据分条写入 for i in range(len(infoList)): writer1.writerow(infoList[i]) #4.关闭文件 csvFile1.close() #writeCsv1("file1.csv") #思考问题:使用普通文件的写入方式写入csv文件??? #三、从字典写入csv文件 def writeCsv2(path): dic = {"张三":123,"李四":111,"王麻子":999} csvFile2 = open(path,"w",newline="") writer2 = csv.writer(csvFile2) #遍历字典 for key in dic: #写入 writer2.writerow([key,dic[key]]) csvFile2.close() writeCsv2("file2.csv") #四、简写方式 def writeCsv3(path): infoList = [['username', 'password', 'age', 'address'], ['zhangsan', 'abc123', '10', 'China'], ['lisi', 'aaa123', '18', 'xian']] with open(path,"w",newline="") as f: wri = csv.writer(f) for item in infoList: wri.writerow(item)
三、枚举类【了解】
代码演示:
from enum import Enum,IntEnum,unique #1.当需要定义常量时,办法:使用大写字母定义变量名 #例如: JAN = 1 FEB = 2 #好处:简单, 缺点;类型为int,并且本质上仍然是一个变量 #2.使用字典的方式定义常量 MONTH = {"JAN":1,"FEB":2} print(MONTH["JAN"]) MONTH["JAN"] = 10 #3.使用类的方式定义常量 class Month(object): #类属性 JAN = 1 FEB = 2 print(Month.JAN) m = Month() print(m.JAN) Month.JAN = 10 m.JAN = 20 #4.枚举类 """ 枚举类型可以被看做是一种标签或者是一系列常量的集合,将其中的常量称为枚举成员或者枚举常量 作用:常用来表示某些特定的有限的集合,例如:月份,星期,状态,性别 实现:enum模块 实现思路: enum中提供了Enum类,IntEnum类和unique装饰器 三个工具 可以继承自Enum类或者IntEnum类 Enum类:通过定义一个类,继承自Enum类,该类就是一个枚举类 IntEnum类:通过定义一个类,继承自IntEnum类,则该类就是一个枚举类,限定枚举成员只能是为整数类型 unique装饰器:前提:类是一个枚举类,修饰一个类,表示该类中的枚举成员只能是唯一的 """ #5.三个工具的使用 #注意1:枚举类的类名一般使用全大写 class MONTH1(Enum): #枚举成员/枚举常量 #注意2:枚举中的成员就是一个实例【对象】,其实就是一个单例对象,不可更改,不可实例化,只能获取 JAN = 1 FEB = 2 #注意3:当一个类继承自IntEnum的时候,则枚举成员的值只能是int或者可以转换为int类型【调用了int()函数】 class MONTH2(IntEnum): JAN = 1 FEB = "11" #注意4:当使用unique修饰一个枚举类的时候,则枚举成员的值不能重复 @unique class MONTH3(IntEnum): JAN = 1 FEB = 2 #MAR = 1 #ValueError: duplicate values found in <enum 'MONTH3'>: MAR -> JAN #6.访问枚举成员 #方式一 print(MONTH3.JAN) print(type(MONTH3.JAN)) #注意5:枚举成员的value一般使用int表示,从0开始 #方式二 jan = MONTH3(1) print(jan) #注意6:区别于普通类,枚举类的成员可以相互访问 #方式三 print(jan.FEB) print(MONTH3.JAN.FEB)
四、高阶函数【掌握】
以一个函数作为参数,返回一个结果,被称为高阶函数
map()
reduce()
filter()
sorted()
1.map
代码演示:
""" map(function,Iterable) function:函数 Iterable:可迭代对象【list,tuple。dict,set,string,生成器】 作用:将传入的函数依次作用于可迭代对象中的每一个元素,并将结果返回 """ #需求1:给一个已知列表中的元素求平方 def square(x): return x ** 2 list1 = [1,2,3,4,5] result1 = map(square,list1) print(result1) #<map object at 0x00000245058B0DD8> print(type(result1)) #<class 'map'> print(list(result1)) #[1, 4, 9, 16, 25] #工作原理 """ newList = [] for num in list1: newList.append(num ** 2) 列表生成式 newList = [num **2 for num in list1] """ result2 = map(lambda x: x ** 2,list1) print(list(result2)) #str = "hello" #需求2:将整型元素的列表转换为字符串元素的列表 #举例:[1,2,3,4,5]---->[“1”,'2','3','4'] #str(1) ---->’1‘ #注意:在使用系统函数之前,最好不要出现同名的变量 result3 = map(str,[1,2,3,4]) print(list(result3)) #需求3:已知两个整型列表,将两个列表中相同位置的元素求和,返回一个新的列表 l1 = [1,2,3,4] l2 = [5,6,7,8] #[6,8,10,12] def add(x,y): return x + y result4 = map(add,l1,l2) print(list(result4)) """ 工作原理 newList1 = [] for i in range(len(l1)): newList1.append(l1[i] + l2[i]) print(newList1) """
2.reduce
代码演示:
from functools import reduce """ reduce(function,Iterable) function;函数 Iterable:可迭代对象,最常用的是list 作用:通过函数对可迭代对象中的元素进行累积,如何进行累积取决于函数中是如何实现的 工作原理:用传给reduce的fucntion先作用于list中的第一个和第二个元素,用得到的结果和list中第三个元素再进行指定的计算。。。 举例: reduce(add,[a,b,c,d]) add(a,b) add(add(a,b),c) add(add(add(a,b),c),d)----->类似于递归 """ #需求1:求一个已知列表中所有元素的和 list1 = [1,2,3,4,5] def add(x,y): return x + y result1 = reduce(add,list1) print(result1) #15 """ 工作原理 add(1,2)---->3 add(3,3)---->6 add(6,4)---->10 add(10,5) ---->15 """ #需求2:将列表[1,3,5,7,9]转换为整数13579 """ 工作原理 13 = 1 * 10 + 3 135 = 13 * 10 + 5 1357 = 135 *10 + 7 13579 = 1357 * 10 + 9 """ list2 = [1,3,5,7,9] def func(x,y): return x * 10 + y result2 = reduce(func,list2) print(result2) #需求3:结合map函数,实现一个将str转换为int的函数 int() #前提:字符串为全数字组成的 def strToInt(s): d = {"0":0,"1":1,"2":2,"3":3} return d[s] #第一步:将字符串中的每一个字符转换为对应的整型,得到一个列表 #strToInt("1") --->1 #strToInt("12301")--->12301 result3 = map(strToInt,"2301") #print(list(result3)) #[2, 3, 0, 1] """ "2301" ---->("2","3","0","1") strToInt("2")---->d[s] --->d["2"] = 2 """ #第二步:将列表中的每一个数字元素进行累积 result4 = reduce(func,list(result3)) print(result4) #2301 result5 = reduce(func,map(strToInt,"2301")) print(result5)
3.filter
代码演示:
""" 过滤器 filter(function,Iterable) function;函数 Iterable:可迭代对象,最常用的是list 作用:进行数据的过滤 工作原理:将传入的函数依次作用于列表中的每一个元素,根据返回的结果为True或者False决定元素是否需要保留 """ #需求1:将已知列表中的偶数元素筛选出来 list1 = [1,2,3,4,5,6,7,8,9,10] newList = [] for num in list1: if num % 2 == 0: newList.append(num) newList1 = [num for num in list1 if num % 2 == 0] def func(num): #保留偶数元素 if num % 2 == 0: return True #剔除奇数元素 return False result1 = filter(func,list1) print(type(result1)) print(list(result1)) #需求2:将下面列表中 爱好为"无"的数据剔除掉 data = [["姓名","爱好","年龄"],["jack","dance",10],["bob","无",18]] def func2(v): v = str(v) if v == "无": return False return True for line in data: result2 = filter(func2,line) print(list(result2))
4.sorted
代码演示:
#冒泡 选择 #1.普通排序 #注意:生成了一个新的列表,默认为升序排序 list1 = [3,2,5,6,2,4] list2 = sorted(list1) print(list1) print(list2) #2.按绝对值排序 #注意:sorted函数中,可以通过关键字key进行指定排序的规则 list3 = [-4,27,-10,5] list4 = sorted(list3,key=abs) print(list4) #3.降序排序 #注意:关键字reverse,reverse=True说明降序 list5 = sorted(list1,reverse=True) print(list5) #4.字符也可以排序,排序的规则:在字典中出现的先后顺序 list6 =['g','o','f','a'] list7 = sorted(list6) print(list7) #5.自定义函数:按照字符串的长度进行排序 def myLen(s): return len(s) list8 = ["fhgh","hello","abc","ll"] list9 = sorted(list8,key=myLen,reverse=True) print(list9)
五、发短信和发邮件【扩展】
APIID:C11345804
APIKey:735d183ae02189f678c26800ac19b03a
1.发短信
代码演示:
# 接口类型:互亿无线触发短信接口,支持发送验证码短信、订单通知短信等。 # 账户注册:请通过该地址开通账户http://sms.ihuyi.com/register.html # 注意事项: # (1)调试期间,请用默认的模板进行测试,默认模板详见接口文档; # (2)请使用APIID(查看APIID请登录用户中心->验证码短信->产品总览->APIID)及 APIkey来调用接口; # (3)该代码仅供接入互亿无线短信接口参考使用,客户可根据实际需要自行编写; # !/usr/local/bin/python # -*- coding:utf-8 -*- import http.client import urllib host = "106.ihuyi.com" sms_send_uri = "/webservice/sms.php?method=Submit" # 用户名是登录用户中心->验证码短信->产品总览->APIID account = "C11345804" # 密码 查看密码请登录用户中心->验证码短信->产品总览->APIKEY password = "735d183ae02189f678c26800ac19b03a" def send_sms(text, mobile): params = urllib.parse.urlencode( {'account': account, 'password': password, 'content': text, 'mobile': mobile, 'format': 'json'}) headers = {"Content-type": "application/x-www-form-urlencoded", "Accept": "text/plain"} conn = http.client.HTTPConnection(host, port=80, timeout=30) conn.request("POST", sms_send_uri, params, headers) response = conn.getresponse() response_str = response.read() conn.close() return response_str if __name__ == '__main__': mobile = "18501970795" text = "您的验证码是:121254。请不要把验证码泄露给其他人。" print(send_sms(text, mobile))
2.发邮件
2.1发送纯文本
代码演示:
#SMTP:简单邮件传输协议,只能用来发送邮件,不能用来接收邮件 #需求:发送纯文本邮件 import smtplib #发邮件 from email.header import Header #邮件的标题 from email.mime.text import MIMEText #邮件的正文 """ user:用户名 pwd:密码【授权码】 sender:发送方 receiver:接收方 content:邮件正文 title:邮件标题 """ def sendMail(user,pwd,sender,receiver,content,title): mail_host = "smtp.163.com" #163的smtp的服务器 #第一部分:准备工作 #1.将邮件信息打包成一个对象 message = MIMEText(content,"plain","utf-8") #内容,格式,编码 #2.设置邮件的发送者 message["From"] = sender #3.设置邮件的接收者 #message["To"] = receiver #注意:邮件的接收者可能有多个,使用list进行处理 message["To"] = ",".join(receiver) #用户1,用户2,一用户3 #4.设置邮件的标题 message["Subject"] = title #第二部分:开始发送邮件 try: #1.启动服务器, #参数:服务器的地址,端口号 smtpObj = smtplib.SMTP_SSL(mail_host,465) #2.登录邮箱并进行验证 #参数:用户名 密码 smtpObj.login(user,pwd) #3.开始发送 #参数;发送者,接收者,发送的信息 smtpObj.sendmail(sender,receiver,message.as_string()) #4.标记发送成功 print("send successful") except smtplib.SMTPException as e: print(e) if __name__ == "__main__": mail_user = "18501970795@163.com" #邮箱用户名 mail_pwd = "yang0122" #邮箱授权码 sender = "18501970795@163.com" #发送方的邮箱地址 receiver = ["1490980468@qq.com"] content = "XAPython1804" title = "邮件测试测试" sendMail(mail_user,mail_pwd,sender,receiver,content,title)
2.2发送带有附件的邮件
代码演示: