一、笔记大纲

二、作业讲解
1、三个作业通用模块,数据库链接以及数据库操作
(1)数据库连接基本信息:创建在一个单独的python文件中,方便修改调用
mysql_info={
"host":"xxx.xx.xxx.xx",
"user":"jxz",
"password":"123456",
"port":3306,
"autocommit":True,
"charset":"utf8"
}
(2)操作数据库以及执行语句,密码加密等操作,进行定义
import pymysql,hashlib
import config
def op_mysql(sql:str,all=True,data_type=1):
# 建立链接
connect=pymysql.connect(**config.mysql_info)
#建立游标 data_type ==1 为字符串类型 其他为字典
if data_type==1:
cursor=connect.cursor()
else:
cursor=connect.cursor(pymysql.cursors.DictCursor)
# 执行语句
cursor.execute(sql)
result=None
if sql.strip().lower().startswith("select"):
if all:
result=cursor.fetchall()
else:
result=cursor.fetchone()
cursor.close()
connect.close()
return result
# 对密码进行md5加密
def md5_pwd(s,salt=""):
s=str(s)
pwd="%s%s"%(s,salt)
md5_pwd=hashlib.md5(pwd.encode())
return md5_pwd.hexdigest()
# 创建数据库
def create_user_table():
sql="create table if not exists lxp_user (id int pramiry key auto_increment,username varchar(15) not null unqiue," \
"password varchar(30) not null,error_count int default 0);"
op_mysql(sql)
1、登录
步骤分解:
(1)检验用户名密码的数据正确性
import tools
import string
#校验账号密码的数据格式
def check_data(username,password):
if not username or not password:
print("用户名或者密码不能为空")
elif len(username)<5 or len(username)>10:
print("用户名长度需要在5-10之间")
elif len(password) not in range(6,13):
print("密码长度需要在6-12之间")
elif not(set(password) &set(string.digits)) or not (set(password) & set(string.ascii_lowercase)) or not\
(set(password) &set(string.ascii_uppercase)):
print("密码复杂度不正确")
else:
return True
(2)校验数据库数据
def check_db(username,password):
user_info_sql="select * from lxp2 where username='%s'"%username
user_info=tools.op_mysql(user_info_sql,all=False,data_type=2)
if not user_info:
print("用户名不存在")
elif user_info.get("err_count")>4:
print("错误次数过多")
elif user_info.get("password") != tools.md5_pwd(password):
print("密码错误")
update_error_sql="update lxp2 set err_count=err_count+1 where username='%s'"%username
tools.op_mysql(update_error_sql)
else:
print("登录成功")
return True
(3)执行登录
def main():
for i in range(3):
username=input("username:").strip().lower()
passwword=input("password:").strip()
if not check_data(username,passwword):
continue
if check_db(username,passwword):
break
else:
print("错误次过多")
if __name__=="__main__":
main()
2、注册
(1)前端校验数据
import tools
import login
#校验账号密码的数据格式 直接使用登录的数据校验+密码和确认密码一致性校验
def check_data(username,password,cpassword):
if login.check_data(username,password) and password==cpassword:
return True
(2)链接数据库校验数据
def check_db(username,password):
user_info_sql="select * from lxp2 where username='%s'"%username
user_info=tools.op_mysql(user_info_sql,all=False,data_type=2)
if user_info:
print("用户名已存在")
return
else:
md5_password=tools.md5_pwd(password)
create_user_sql="insert into lxp2(username,password) values('%s','%s');"%(username,md5_password)
tools.op_mysql(create_user_sql)
print("注册成功")
return True
(3)执行注册
def main():
for i in range(3):
username=input("username:").strip().lower()
password=input("password:").strip()
cpassword=input("cpassword:").strip()
if not check_data(username,password,cpassword):
continue
if check_db(username,password):
break
else:
print("错误次过多")
if __name__=="__main__":
main()
3、导出数据库
(1)获取表头
# 判断以及获取表头函数
def get_table_title(table_name):
#
table_col_info="select column_name from information_schema.COLUMNS where table_name ='%s';"%table_name
table_file=tools.op_mysql(table_col_info)
title=[table[0] for table in table_file]
return title
(2)写入execl
def write_execl(data,execl_name):
book=xlwt.Workbook()
sheet=book.add_sheet("sheet1")
for row, row_data in enumerate(data):
for col, col_data in enumerate(row_data):
# print(col_data)
sheet.write(row, col,col_data)
book.save(execl_name)
(3)执行函数
def main(table_name):
title=get_table_title(table_name)
if not title:
print("表不存在")
query_data_sql="select * from %s;" % table_name
# query_data_sql = "select * from %s;" % table_name
result=list(tools.op_mysql(query_data_sql))
result.insert(0,title)
execl_name="%s_%s.xls"%(time.strftime('%Y%m%d%H%M%S'),table_name)
write_execl(result,execl_name)
if __name__ =="__main__":
main('lxp2')
三、redis操作
1、redis连接
import redis
r=redis.Redis(host="xxx.xx.x.xxx",password="HK139bc&*",port=6379,db=4,decode_responses=True) # decode_responses=True将btye 转化为字符串
2、字符串格式操作
(1)新增:set 三个参数意义:key,value,失效时间
新增修改 第三个参数为失效时间
r.set("lxp_session","lixingpei",60
(2)获取:get(key)
print(r.get("lxp_session")
(3)删除:delete
r.delete("lxp_session")
3、哈希格式操作(大字典):不能打小key设置过期时间,只能对整体设置过期时间
(1)新增一条:hset
r.hset("test","lxp",'{"id":"1","score":"90"}')
(2)插入多条:hmset
d={"lxp02":"{'id':'2','name':'lxp2','sex':'女'}","lxp03":"{'id':'3','name':'lxp3','sex':'女'}"}
r.hmset("students",d) # 直接插入多条数据
(3)获取一条:hget
print(r.hget("students","lxp1")) # 获取 大key,小key
(4)获取多条:hgetall
print(r.hgetall("students")) # 获取所有数据
(5)删除一条:hdel
r.hdel("students","lxp1") # 删除单个
(6)删除多条:delete
r.delete("students") # 删除所有
(7)判断小key是否存在:hexists、
print(r.hexists("students","lxp") )
(8)byte类型转化为字符串类型
第一种方法:
创建连接时写入:
decode_responses=True将btye 转化为字符串
第二种方法:decode
lxp=r.hget("students","lxp2")
print(lxp.decode()) # 转化为字符串
4、list操作
(1)新增:lpussh,rpush
r.lpush("blacks_list1","1") # 从左边添加
r.rpush("blacks_list1","4") # 从右侧添加
(2)获取:lrange:从0开始 顾头顾尾,没有反方向取值
print(r.lrange("blacks_list1",0,1))
(3)删除:左侧删除,右侧删除 删除除指定位置外的元素,按照指定次数删除指定元素
左侧删除:r.lpop("blacks_list1") # 从左侧删除
右侧删除:r.rpop("blacks_list1") # 从右侧删除
删除除指定位置外的元素:
print(r.ltrim("blacks_list1",0,0)) #除了第一个全部删除
依照指定次数删除指定元素:
print(r.lrem("blacks_list1",1,"hhh"))
(4)修改,指定位置:lset
r.lset("blacks_list1",0,"hhh")
(5)获取长度:llen
print(r.llen("blacks_list1")) # 获取长度
5、通用方法
(1)获取失效时间:ttl()
获取失效时间 -1 代表永久生效 除非是重启服务
print(r.ttl("lxp_session"))
(2)获取当前数据库中所有的key:keys()
print(r.keys()) # 获取当前数据库中的所有key
print(r.keys("*_*")) # 获取可以加条件
(3)判断key是否存在:exists()
print(r.exists("lxp_session")) # 判断是否存在 返回0代表不存在 1代表存在
(4)查看key的类型:type()
print(r.type("lxp_session")) # 查看key的类型
(5)设置过期时间:expire()
r.expire("lxp_session",60) # 设置过期时间 前面为key 后面为过期时间 单位为秒
(6)清空所有数据库
r.flushall()# 清空所有数据库
(7)清空当前数据库
r.flushdb()# 清空当前数据库
5、redis练习:数据迁移:
import redis
r=redis.Redis(host="xxx.xx.xx.xx",password="HK139bc&*",port=6379,db=4,decode_responses=True)
r2=redis.Redis(host="xxx.xx.xxx.xx",password="HK139bc&*",port=6379,db=11,decode_responses=True)
for k in r.keys():
k_type=r.type(k)
if k_type=="string":
value=r.get(k)
r2.set(k,value)
elif k_type=="hash":
dic=r.hgetall(k)
r2.hmset(k,dic)
elif k_type=="list":
l_len=r.llen(k)
result=r.lrange(k,0,l_len)
r2.rpush(k,*result)
四、execl操作
1、xlrd:读取内容
读取内容原理:引入--实例化 --获取sheet页--读取
xlrt和xlwd读写超过65536会报错
(1)引入,实例化
import xlrd
book=xlrd.open_workbook("test.xls")
(2)获取sheet页
通过名字获取
sheet=book.sheet_by_name("sheet1") 通过名字
通过索引获取:
sheet=book.sheet_by_index(0) # 通过索引
(3)获取内容:
某个单元格内容:
print(sheet.cell(0,0).value)# 获取某一个单元格
获取整行数据
print(sheet.row_values(0))# 获取整行数据
获取整列数据
print(sheet.col_values(0))# 获取列数据
获取总共有多少行
print(sheet.nrows)# 总共多少行
获取总共有多少列
print(sheet.ncols)#总共多少列
获取所有的sheet
book.sheets()
2、xlutils:修改:
读取--复制 -修改--保存
import xlrd
from xlutils import copy
book=xlrd.open_workbook("test.xls")
new_book=copy.copy(book)
sheet=new_book.get_sheet(0)
print(dir(sheet))
sheet.write(0,0,"编号")
new_book.save("test.xls")
3、多行修改:openpyxl
引入--实例化:
import openpyxl
book=openpyxl.load_workbook("test2.xlsx")
获取sheet:
sheet=book["test1"]
获取所有sheet页
print(book.sheetnames)
获取所有行
print(list(sheet.rows) )
获取有多少行
print(sheet.max_row)
获取有多少列
print(sheet.max_column)
修改
sheet.cell(1,1).value="编号"
print(sheet.cell(1, 1).value)
print(sheet["A1"].value) # a是第一列 1 代表第一行 如果是第二列 就是b
print(sheet["A2"].value)
sheet["A1"]="编号"
book.save("test2.xlsx")
五、网络请求
模块:requests
1.get请求
import requests
url = "http://.xxxx.cn/api/user/stu_info"
data={"stu_name":"小黑"}
req=requests.get(url,data)
print(req.json())
2、post请求之k-v格式
url1="http://xxx.xxxx.cn/api/user/login"
data1={"username":"xxxx","passwd":"aA123456"}
data2={"version":1}
#(1)k-v格式 data=data
req=requests.post(url1,params=data2,data=data1) params 从url里面发出 不是必填的
print(req.json())
3、json格式 json=data
url="http://xxx.xxx.cn/api/user/add_stu"
data={
"grade":"飞马座",
"phone":"13555338909",
"name":"hhh"
}
req=requests.post(url,json=data)
print(req.url)
print(req.json())
4、需要上传cookie: cookies=cookie
(1)直接传cookie
url = "https://qun.qq.com/cgi-bin/qun_mgr/search_group_members"
data={
'gc': 117545216,
'st': "0",
'end': "20",
'sort': 0,
'bkn': "1748190229"
}
cookie={'_qpsvr_localtk': '0.9708018590285696',
'uin': 'o1164019076', 'skey': '@21AFqIqD7',
'RK': 'h6RBy2WqQM', 'ptcz': '20a23ea6b2deb099287624b4e452bb0a9419dc427617d8344aa79fae1417d6eb',
'p_uin': 'o1164019076', 'pt4_token': 'CmdQpCaCkY4OjNWktzbggxGQhO*FxtHJyqADQG3Gjag_',
'p_skey': 'nJY4KF-Dr2OFb*2dtAwiNjtW-AJ6Z48ADb6q4ccdQys_',
'traceid': '4b3d0e4d8f'}
req=requests.post(url,data,cookies=cookie)
(2)通过header :header={cookie:""}
header={"cookie": "_qpsvr_localtk=0.9708018590285696; uin=o1164019076; skey=@21AFqIqD7; RK=h6RBy2WqQM; ptcz=20a23ea6b2deb099287624b4e452bb0a9419dc427617d8344aa79fae1417d6eb; p_uin=o1164019076; pt4_token=CmdQpCaCkY4OjNWktzbggxGQhO*FxtHJyqADQG3Gjag_; p_skey=nJY4KF-Dr2OFb*2dtAwiNjtW-AJ6Z48ADb6q4ccdQys_; traceid=4b3d0e4d8f"}
# req=requests.post(url,data,headers=header)
5、下载
url = "http://xxx.xxxx.cn/api/file/file_upload"
data={"file":open('test2.xlsx','rb')} # rb模式打开
req=requests.post(url,files=data)
6、上传
url="http://aliimg.changba.com/cache/photo/941190975_200_200.jpg"
req=requests.get(url)
with open("a1.jpg","wb") as fw:
fw.write(req.content)
7、获取结果的几种方式
(1)返回字典
print(req.json()) # 返回字典 ,如果接口返回的不是json 会报错 {'error_code': 2, 'msg': '无结果'}
(2)返回字符串
print(req.text) # 返回字符串
(3)返回byte
print(req.content) # 返回的是bytes
(4)返回状态码
print(req.status_code) # 返回状态码
(5)返回cookie
print(req.cookies) # 返回cookie
(6)返回请求头
print(req.headers) #返回请求头
8、练习题:获取好友信息写入到execl里面
import random
import requests,xlwt,random
url="https://qun.qq.com/cgi-bin/qun_mgr/get_friend_list"
data={
"bkn": 1909363893
}
header={"cookie":"RK=h6RBy2WqQM; ptcz=20a23ea6b2deb099287624b4e452bb0a9419dc427617d8344aa79fae1417d6eb; traceid=0fb7afcc55; _qpsvr_localtk=0.2848722380254445; uin=o1164019076; skey=@I6eUauRAn; p_uin=o1164019076; pt4_token=ku6gK4fgK2rykkL*PZu3eL1iVt00GaqGrqsT-*FmwRI_; p_skey=0BTxgerNa54TvnxoSO5uMEsRt6lUFkNFbbBzGZzMJqE_"}
req=requests.post(url,data,headers=header)
print(req.json())
result=req.json().get("result")
book=xlwt.Workbook()
for index,g_info in result.items():
g_name=g_info.get("gname") if g_info.get("gname") else "默认分组"
# print(g_name)
g_mems=g_info.get("mems") # [{'name': 'HR-郭乐', 'uin': 16388200}, {'name': '李晓慧', 'uin': 541965125}]
try:
sheet = book.add_sheet(g_name)
except Exception as e:
sheet_name="好友分组%s"%random.randint(1.1000)
print("sheet页名字不合法")
sheet=book.add_sheet(sheet_name)
# print("当前分组是===============%s"%g_name)
for col,mems in enumerate(g_mems):
print(col)
nick=mems.get("name")
qq=mems.get('uin')
sheet.write(col, 0, nick)
sheet.write(col, 1, qq)
book.save("qq.xls")
六、异常处理
1、指定异常
(1)主键异常:KeyError
l=[1,2,3]
d={"name":"111"}
# print(l[4])
try:
name=d["n1ame"]
# l[4]
#https://www.cnblogs.com/small-wei/p/13468363.html 所有异常查找
except KeyError as e: #错误类型 如果写了只能捕捉指定异常
print(e)
print("主键异常")
(2)索引异常:IndexError
import traceback # 自带模块
l=[1,2,3]
d={"name":"111"}
# print(l[4])
try:
# name=d["n1ame"]
l[4]
#https://www.cnblogs.com/small-wei/p/13468363.html 所有异常查找
except IndexError as e:
print(e)
print("下标异常")
2、所有异常:Exception
finally:不管有没有异常都会执行
except Exception as e:
traceback.print_exc()
# 获取保存信息 可以放在日志里面
msg=traceback.format_exc()
print(msg)
# print("出现异常了")
# 可以不写
else:
print("无异常")
finally:
print("不管出没出异常都会走")
3、异常打印:traceback模块:
traceback.print_exc()
# 获取保存信息 可以放在日志里面
msg=traceback.format_exc()
print(msg)
七、发送邮件
1、qq邮件:
配置获取:在邮箱设置--账户下面开启POP3/SMTP服务
发送格式:
import yamail
username="517882144@qq.com"
password="xxxxxxxxxxx"
host="smtp.qq.com"
smtp=yamail.SMTP(host=host,user=username,password=password)
smtp.send(
to=["1164019076@qq.com"],
# cc=["517882144@qq.com"],
subject=["摘要"],
contents=["内容"],
attachments=["qq151.xls"]
)
2、钉钉邮件
(1)关键字
步骤:添加自定义机器人:webbook为url:
参数查找网址:https://developers.dingtalk.com/document/app/message-types-and-data-format,查找消息类型与数据格式
发送消息:
import requests
url="https://oapi.dingtalk.com/robot/send?access_token=fed61e1ccbbf1c0ce5688360debc31f38f4e6691d035bf8b8e4068bb3f001a0b"
data={
"msgtype": "text",
"text": {
"content": "1,lalall"
}
}
req=requests.post(url,json=data)
print(req.json())
艾特某些人:
data={
"msgtype": "text",
"text": {
"content": "test,11111"
},
"at":{
"atMobiles":["13224245499"],
"isAtAll":False
}
}
艾特所有人:
data={
"msgtype": "text",
"text": {
"content": "test,11111"
},
"at":{
# "atMobiles":["13224245499"],
# "isAtAll":False
"isAtAll":True
}
(2)加签
机器人自定义选择加签:
找到官方文档
import time
import hmac
import hashlib
import base64
import urllib.parse
def dd_sign():
timestamp = str(round(time.time() * 1000))
secret = 'SECd804f4f67e86268c02aab9e0bbaa4fb9c38332d3fedb52f9d6d603a7c6b13bf7'
secret_enc = secret.encode('utf-8')
string_to_sign = '{}\n{}'.format(timestamp, secret)
string_to_sign_enc = string_to_sign.encode('utf-8')
hmac_code = hmac.new(secret_enc, string_to_sign_enc, digestmod=hashlib.sha256).digest()
sign = urllib.parse.quote_plus(base64.b64encode(hmac_code))
return timestamp,sign
def send_dd_msg(msg,at=None,at_all=True):
url = "https://oapi.dingtalk.com/robot/send"
data={
"msgtype": "text",
"text": {
"content": msg
},
"at":{
"atMobiles":at,
"isAtAll":at_all
}
}
timestamp,sign=dd_sign()
params={
'access_token':"c832d0431e985fc899d0b36998afbc46a7d3545f21edc487e3770e0edcd0b881",
"sign":sign,
"timestamp":timestamp
}
try:
req = requests.post(url, json=data,params=params)
except:
print("钉钉消息发送失败")
else:
if req.json().get("errcode") ==0:
print("发送成功")
return True
# send_dd_msg("快上班了")
send_dd_msg("买山竹",at=["1355678909"],at_all=False)
浙公网安备 33010602011771号