7.redis excel读写
上周复习:
1、内置函数
len
type
max()
sum()
round(5.3212,2)#取几位小数
char() #
ord() #
sorted()#排序
reversed()#反向
res = list(filter(func,[1,2,3,4,5]))#循环调用函数,False过滤,必须用list转换
res = list(map(func,[1,2,3,4,5]))循环调用,返回结果,必须用list转换
id()
eval('1+1')#执行简单代码
'''
import os
os.system('xxx')
'''
exec('')#执行复杂代码
2、函数的一点补充
递归:函数自己调用自己。
3、匿名函数
lambda s:str(s).isdigit()
def func(s):
return str(s).isdigit()
4、第三方模块安装
pip install xxx
easy_install xxx 需要安装setuptools模块
1、python操作xxx的模块
.whl
pip install 路径/pymysql.whl
.tar.gz
解压
python3 setup.py install
下面是电脑上装了多个版本的python
那你要去python的安装目录下,分别把python.exe
改个名字,能区分出来是python2还是python3
python2 -m pip install xxx
python3 -m pip install xxx
5、hashlib模块
import hashlib
s = 'xxxxx'
s = s.encode()
m = hashlib.md5(s)
res = m.hexdigest()
6、mysql数据库操作
import pymysql
conn = pymysql.connect(host,user,db,password,port,charset,
autocommit=True)
cur = conn.cursor(pymysql.cursors.DictCursor)
cur.execute(sql)
'select * from user;'
cur.fetchall() # ((1,name,password),(2,name,passwd2))
cur.fetchone() # (1,name,passwrd) {'id':1,"name":name,
"password":123234}
cur.close()
conn.close()
os.walk(r'e:\\') #递归循环一个目录
上周作业:
#1.需求:写一个函数,传入一个路径和一个关键字(关键字是文件内容),找到文件内容里面有这个关键字的文件
#循环读取路径下文件,存在关键字,返回路径+文件名
import os def seekfile(keyword,path=r'C:\Users\HDL\PycharmProjects\untitled\python'): for cur_path, cur_dirs, cur_files in os.walk(path): for file in cur_files: if file.endswith('.txt'): with open(os.path.join(cur_path,file),'r',encoding='utf-8') as f: for line in f: if keyword in line: res=os.path.join(cur_path,file) print('包含%s的文件是%s'%(keyword,res)) break seekfile('list')
#2、删除3天前的日志文件
#1、要获取到所有的日志文件 os.walk()
#2、先获取到文件的时间
#3、要判断文件的日期是否在三天前 当天的日期的时间戳 - 60*60*24*3
import time def timestampToStr(timestamp=None,format='%Y-%m-%d %H:%M:%S'): #时间戳转格式化好的时间 if timestamp: time1 = time.localtime(timestamp) res = time.strftime(format, time1) else: res = time.strftime(format) return res #20180304153958 def strTotimestamp(str=None,format='%Y%m%d%H%M%S'): #格式化的时间转时间戳 if str: timep = time.strptime(str, format) res = time.mktime(timep) else: res = time.time() return int(res) def clean_log(path,day=3): for cur_path, dirs, files in os.walk(path): for file in files: if file.endswith('log'): f_time = file.split('.')[0].split('_')[-1] file_timestamp = strTotimestamp(f_time,'%Y-%m-%d') cur_timestamp = strTotimestamp(time.strftime('%Y-%m-%d'),'%Y-%m-%d') if (cur_timestamp - file_timestamp) >= 60*60*24*day:#判断文件的时间是否大于3天 os.remove(os.path.join(cur_path,file))
3.注册、登录功能,从数据库判断用户是否存在,密码要加密
#需求:写一个注册的功能,要求数据存在数据库里面
# 1、名字为空、已经存在都要校验
# 2、校验通过之后,密码要存成密文的。
#定义函数,mysql操作,不传入用户名表示读取数据库表,传入表示写入数据库
#读取数据库表,判断用户名是否存在
#md5密码加密,加盐
#登录、注册 import pymysql def my_db(sql): conn = pymysql.connect(host='118.24.3.40',user='jxz',password='123456', db='jxz',port=3306,charset='utf8',autocommit=True) cur = conn.cursor(pymysql.cursors.DictCursor) cur.execute(sql) res = cur.fetchone() #{'username':'nhy'} {} cur.close() conn.close() return res import hashlib def my_md5(s,salt=''): s = s+salt news = str(s).encode() m = hashlib.md5(news) return m.hexdigest() def reg(): for i in range(3): user =input('username:').strip().upper() pd = input('password:').strip() cpd = input('cpwd:').strip() sql='select username from app_myuser where username = "%s";'%user if len(user) not in range(6,11) or len(pd) not in range(6,11): # 6 7 8 9 10 print('账号/密码长度错误,6-10位之间') elif pd != cpd: print('两次输入密码不一致') elif my_db(sql): print('用户已存在') else: md5_passwd = my_md5(pd) insert_sql= 'insert into app_myuser (username,passwd,is_admin) ' \ 'value ("%s","%s",1);'%(user,md5_passwd) my_db(insert_sql) print('注册成功!') break else: print('失败次数过多!') def login(): for i in range(3): username = input('请输入用户名:').strip().upper() password = input('请输入密码:').strip() sql='select username,passwd from app_myuser where username = "%s";'%username if username =='' or password =='': print('账号/密码不能为空') else: res = my_db(sql) # {'username':nhy 'passwd':'xxxxx'} if res: if my_md5(password) == res.get('passwd'): print('登陆成功!') break else: print('密码错误!') else: print('用户不存在') else: print('错误次数过多!')
上课内容:
导入模块:
1.导入模块的实质:
import 一个模块的实质就是把这个python文件从头到尾执行一遍
import my
注:直接导入文件名,不要加”.py”,把my里边的从头到尾执行一遍
2. import模块的查找模块的顺序
1) 从当前目录下找该文件
2) 从sys.path系统路径下查找该文件
3) 从上面2个目录都找不到,那就报错
3. 调用导入模块中的函数
1) 直接import
import my#导入模块
my.sayName()#调用模块中的函数,前边一定要有模块名
2) from import
from my import sayName #from 模块文件名 import 函数名
sayName()#直接调用函数,不用加my.
3. 模块文件放到哪里合适
1) 放到当前文件的目录下,这样比较麻烦,每次需要复制模块文件
2) 放到sys.path的其中一个路径下,但是每次需要复制模块文件
3) 把模块文件的路径加到sys.path中,但是这个只是临时的,每次导入模块文件之前都需要执行这个操作,比较麻烦
sys.path.append(r'/Users/nhy/PycharmProjects/day6')
4) Pycharm左侧树下新建一个文件夹,里边存放常用的模块文件,选中该文件夹右键Mark Dicrectory As-Sources Root,则该文件夹及下边文件添加到sys.path下,永久有效,重启pycharmy也不会丢失
4.调用导入模块中的函数
1) 直接import
import my#导入模块
my.sayName()#调用模块中的函数,前边一定要有模块名
2) from import
from my import sayName #from 模块文件名 import 函数名
sayName() #直接调用函数,不用加”my."
5. if __name__ == '__main__':
别的文件里面导入这个python文件的话,就不执行下面的代码
执行自身文件会被执行
1) tool.py文件最下边写上下边内容
if __name__ == '__main__':
print(strTotimestamp())
print(clean_log('.'))
print(clean_log('.',2))
2) 单独右键执行tools.py文件,则下边文件内容会执行,直接执行
print(strTotimestamp())
print(clean_log('.'))
print(clean_log('.',2))
3) 某个文件比如d.py,导入tools模块,执行d.py文件时,if __name__ == '__main__'下边的内容不会被执行
import tools
则下边内容不会被执行
print(strTotimestamp())
print(clean_log('.'))
print(clean_log('.',2))
redis:一种非关系型数据库
1.关系型数据库和非关系型数据库
关系型数据库:用数据库、表存数据,表之间通过id相互关联,数据是存在磁盘上的
传统的关系型数据库:mysql、oracle、sql server
database
table1 user userid
table2 account userid
table3 order
userid
sql语句来操作数据
非关系型数据库、NOSQL
数据是存在内存里面,比较快
不需要通过sql语句来查询数据
传统的非关系型数据库:MongoDB(数据存在磁盘上)、redis、memcache
非关系型数据库存储数据是key = vaule形式
2.Python代码操作数据库
import redis #导入模块 ip = '***.**.*.**' password='******' r = redis.Redis(host=ip,password=password,port=6379,db=10, decode_responses=True)#连接redis #db=10 表示使用第几个数据库,默认是第0个 #decode_responses=True 表示返回数据是字符串 #string类型 # 增 set(key,value) # 删 delete(key) # 修改 set(key,value) # 查 get(key) r.set('nhy_sessionn','sdfsdfssd',30) #30指过期释放时间30s r.set('nhy_info','{"name":"xxxx","password":"123456","account":11234}') r.delete('nhy_info') #删一个不存在的key,不报错 res = r.get('nhy_info') r.flushall() #清空所有数据库里面的数据 r.flushdb() #只清空当前数据库里面的数据 r.keys() #获取到所有的key r.keys('*session*') #模糊匹配,获取到包含session的key r.expire('qml_session',30) #指定过期时间,过期之后就释放了
# 哈希类型hash #两层嵌套,外边一个大key,里边有小key #'nhy_info','{"name":"xxxx","password":"123456"} # 增 r.hset(大key,小key,value) # 删 r.delete(大key) r.hdel(大key,小key) # 修改 r.hset(大key,小key,value1) # 查 r.hgetall(大key) r.hget(大key,小key) r.hset('sms_code','18612532945','121213')#set值,两个小key不同 r.hset('sms_code','18612532941','121313') r.delete('sms_code') #把整个key删除掉 r.hdel('sms_code','18201034732') #删除指定的key r.hgetall('sms_code') #获取到这个key里面所有的内容,一个字典 {'18612532945': '121213', '18612532941': '121313'} r.hget('sms_code','18201034732') #获指定key值,一个字符串 #r.type(key) 获取key的类型string hash r.type('sms_code') r.type('lyl_session007')
3. 练习要把a redis里面的数据 全部到迁移到b redis
# 1、连上2个redis # 2、先从a redis里面获取到所有key # 3、然后判断key是什么类型,根据类型来判断使用什么方法 # 4、从aredis里面获取到数据,set 到b redis里面 import redis ip = ***.**.*.**' password='*****' r = redis.Redis(host=ip,password=password,port=6379,db=3, decode_responses=True)#连接redis r2 = redis.Redis(host=ip,password=password,port=6378,db=2, decode_responses=True)#连接redis all_key = r.keys() for k in all_key: if r.type(k) == 'string': a_data = r.get(k)#从aredis获取到的数据 r2.set(k,a_data) elif r.type(k) =='hash': hash_data = r.hgetall(k) # {'key1':'v1',key2:v2} for key,v in hash_data.items(): r2.hset(k,key,v)
excel操作:
命令行执行下边命令,安装模块
pip install xlrd #读excel
pip install xlwt #写excel
pip install xlutils #修改excel
写excel:
一个一个单元格写入,行号从0开始,列号从0开始
import xlwt #导入修改模块 book = xlwt.Workbook() #新建一个excel sheet = book.add_sheet('sheet1') #添加一个sheet页 stu_info = [ ['编号','姓名','密码','性别','地址'], [1,'machunbo','sdfsd23sdfsdf2','男','北京'], [2,'machunbo2','sdfsd23sdfsdf2','男','北京'], [3,'machunb3','sdfsd23sdfsdf2','男','北京'], [4,'machunbo4','sdfsd23sdfsdf2','男','北京'], [5,'machunbo5','sdfsd23sdfsdf2','男','北京'], [6,'machunbo6','sdfsd23sdfsdf2','男','北京'], [7,'machunbo6','sdfsd23sdfsdf2','男','北京'], [8,'machunbo6','sdfsd23sdfsdf2','男','北京'], [9,'machunbo6','sdfsd23sdfsdf2','男','北京'], [10,'machunbo6','sdfsd23sdfsdf2','男','北京'], [11,'machunbo6','sdfsd23sdfsdf2','男','北京'], ] #sheet.write(行号,列号,写入的字符串) #方法1:自定义变量,利用变量+1控制行列循环写入 row = 0 #行 for stu in stu_info: col = 0 # 列 for s in stu: #控制列 sheet.write(row,col,s) #0 3 男 col+=1 row+=1 #方法2:利用列表、元组的下标写入, #mysql数据库查询数据是二维元组,可以写入excel for index,value in enumerate(stu_info): # enumerate() 表示取到下标和值 index:下标 value:值,表示取到每行 #index:0 value: ['编号','姓名','密码','性别','地址'] #index:1 value: [1,'machunbo','sdfsd23sdfsdf2','男','北京'] for index2,v2 in enumerate(value):#再把每行按下标拆分列表 #index2:0 v2: '编号' #index2:1 v2: '姓名' sheet.write(index,index2,v2) book.save('stu3.xls')
#保存excel wps:文件名后缀是 xls或xlsx,微软的office后缀必须是xls
读excel
import xlrd #导入读excel模块 book = xlrd.open_workbook('stu3.xls')#打开需要读取的文件 sheet = book.sheet_by_index(0)#打开需要读取的sheet页 # sheet = book.sheet_by_name('sheet1') #sheet页可以通过序号读取,也可以通过名称读取 sheet.cell(0,0).value#获取指定单元格的内容,0行0列的单元格 sheet.cell(1,0).value sheet.row_values(0) #获取整行的数据,0行,结果为列表 #['id', '姓名', '密码', 'password', '地址'] sheet.row_values(1)#1行 sheet.col_values(0)#获取整列的数据,0列,,结果为列表 sheet.col_values(1)#1列 sheet.nrows #行数 sheet.ncols #列数 for row in range(1,sheet.nrows):#按行读取excel表内容 print(sheet.row_values(row))
修改excel
#1、先打开原来的excel #2、复制一份 #3、在复制的excel上修改 #4、保存 import xlrd #导入读取excel模块 from xlutils import copy #导入修改excel模块,直接使用copy方法 book = xlrd.open_workbook('stu3.xls') new_book = copy.copy(book) #复制原来的excel sheet = new_book.get_sheet(0) #在复制的excel上修改,获取sheet页得用get_sheet() sheet.write(0,0,'id')#直接使用write(行号,列号,值)进行修改 sheet.write(0,3,'password') new_book.save('stu3.xls')#保存文件,文件名必须与原文件名一致
接口开发:
使用flask模块,web框架,mock(模拟)服务,创建服务
服务里边创建接口
接口URL中传入参数,根据参数执行python代码,返回数据
1. 简单流程
import flask #导入flask模块 server = flask.Flask(__name__) #新建一个服务,__name__表示把当前这个python文件当做一个服务 @server.route('/login',methods=['get']) def hello(): #函数紧挨着上边添加@server.route(),表示这个函数变成一个接口 #‘login’,表示访问路径是 ip:8000/login #methods=['get']表示访问url方法是get return 'hello' server.run()#启动这个服务
#执行该脚本
浏览器访问路径:http://127.0.0.1:5000/login
后边路径与创建接口时写的路径一致
2. 指定ip端口号启动服务
server.run(host='0.0.0.0',port=8999,debug=True)#启动服务
#若ip是127.0.0.1,只能本机访问
#指定0.0.0.0,同一局域网的其他人也可以访问这台机器
#比如本机ip是172.16.104.12,同一局域网内的其他人可以访问172.16.104.12
#port=8999表示指定端口号是8999
#debug=True 表示修改代码之后自动重启服务
#访问路径是http:// 172.16.104.12:8999/login
说明:再次启动服务不能直接运行python文件,一定要点击重新运行按钮,否则旧服务没有停止,提示端口被占用
3. 如何从url中获取参数
@server.route('/login',methods=['get']) def hello(): uname = flask.request.values.get('username') #从url中获取username的值 pd = flask.request.values.get('passwd') #从url中获取passwd的值 return '%s %s'%(uname,pd)
重新启动服务
浏览器访问路径:
http://172.16.104.12:8999/login?username=hudonglian&&passwd=123456
4.一个服务创建多个接口
5.练习:使用接口访问数据库,登录功能
import flask #导入flask模块 import tools #里边包含连接数据库,md5加密函数 import json server = flask.Flask(__name__) #新建一个服务,__name__表示把当前这个python文件当做一个服务 @server.route('/login',methods=['get']) def hello(): uname = flask.request.values.get('username') #从url中获取username的值 pd = flask.request.values.get('passwd') #从url中获取passwd的值 sql = 'select * from app_myuser where username="%s";'%uname res = tools.my_db(sql) if res: if tools.my_md5(pd) == res.get('passwd'): res = {"code":0,"msg":"登录成功!"} else: res = {"code":1,"msg":"密码错误!"} else: res = {'code':2,"msg":"用户不存在"} return json.dumps(res,ensure_ascii=False,indent=4) #将返回的字典变成json串