python笔记六(修改excel,内置函数,接口开发,操作redis,操作数据库,读excel)
1.修改excel
1 # python3 -m pip instatll xlutils #指定装到那个Python版本的(针对有多个Python) 2 import xlrd 3 from xlutils import copy 4 book = xlrd.open_workbook('students.xls') 5 #先用xlrd模块,打开一个excel 6 new_book = copy.copy(book) 7 #通过xlutils这个模块里面的copy方法,复制一份excel 8 sheet = new_book.get_sheet(0)#获取sheet页 9 list = ['编号','名字','性别','年龄','班级','地址'] 10 # col = 0 11 # for i in list: 12 # sheet.write(0, col, i) 13 # col+=1 14 for col,filed in enumerate(list): #和上面的四行一样的 15 sheet.write(0, col, filed) 16 # sheet.write(0,0,'编号') 17 # sheet.write(0,1,'名字') 18 new_book.save('students.xls')
2.读excel
1 import xlrd 2 book = xlrd.open_workbook('students.xls') 3 sheet = book.sheet_by_index(0)#根据下标 4 sheet1 = book.sheet_by_name('sheet1')#根据名字 5 print(sheet.cell(0,0).value)#指定sheet页里面的行和列 6 print(sheet.cell(1,0).value)#指定sheet页里面的行和列 7 print(sheet.row_values(0))#这个是获取到第几行的内容 8 print(sheet.row_values(1)) 9 print(sheet.nrows)#获取到excel里面一共有多少行 10 print(type(sheet.nrows)) 11 for i in range(sheet.nrows):#循环获取到每行的数据 12 print(sheet.row_values(i)) 13 print(sheet.ncols)#总共多少列 14 print(sheet.col_values(0))#取第几列的数据 15 for i in range(sheet.ncols):#循环获取到每列的数据 16 print(sheet.col_values(i))
3.通用导出excel
1 import pymysql,xlwt 2 def export_excel(table_name): 3 host,user,passwd,db = '192.168.174.128','root','123456','zuoye' 4 coon = pymysql.connect(user = user, 5 host = host, 6 port= 3306, 7 passwd = passwd, 8 db=db, 9 charset='utf8' 10 ) 11 12 cur = coon.cursor()#建立游标,指定cursors类型返回的是字典 13 sql = 'select * from %s;'%table_name 14 cur.execute(sql) 15 fileds = [filed[0] for filed in cur.description] # 这一行代码与上面三行的是一样的 16 res = cur.fetchall() 17 book = xlwt.Workbook() 18 sheet = book.add_sheet('sheet') 19 col = 0 20 for filed in fileds: #写标头 21 sheet.write(0,col,filed) 22 col+=1 23 row = 1 # 行数 24 for date in res: # 控制行数 25 col = 0 26 for filed in date: # 写标头 27 sheet.write(row, col, filed) 28 col += 1 29 row += 1 # 每次写完一行,行数加1 30 book.save('%s.xls'%table_name) 31 export_excel('students')
4.内置函数:enumerate()这个函数能自动的计算下标
1 enumerate()#这个函数能自动的计算下标 2 fileds = ['id','name','sex','addr'] 3 for index,fiiled in enumerate(fileds): 4 print(index,fiiled) 5 6 7 import pymysql,xlwt 8 def export_excel(table_name): 9 host,user,passwd,db = '192.168.174.128','root','123456','zuoye' 10 coon = pymysql.connect(user = user, 11 host = host, 12 port= 3306, 13 passwd = passwd, 14 db=db, 15 charset='utf8' 16 ) 17 18 cur = coon.cursor()#建立游标,指定cursors类型返回的是字典 19 sql = 'select * from %s;'%table_name 20 cur.execute(sql) 21 fileds = [filed[0] for filed in cur.description] # 这一行代码与上面三行的是一样的 22 res = cur.fetchall() 23 book = xlwt.Workbook() 24 sheet = book.add_sheet('sheet') 25 for col,filed in enumerate(fileds): #写标头 26 sheet.write(0,col,filed) 27 row = 1#行数 28 for date in res:#控制行数 29 for col, filed in enumerate(date): # 控制列 30 sheet.write(row, col, filed) 31 row+=1#每次写完一行,行数加1 32 book.save('%s.xls'%table_name) 33 export_excel('students')
5.操作数据库,区分获取SQL的集中方法:
res = cur.fetchall()#获取到这个sql执行的全部结果[['1','2']] [{},{}]他把数据库表里面的每一行数据放到一个list里面
res = cur.fetchone()#获取到这个sql执行的一条结果,他返回就只是一条数据
#如果sql语句执行的结果是多条数据的时候那么就用fetchall()
#如果你能确定sql执行的结果就只有一条,那么就用fetchone()
cur.fetchmany()#能传入一个个数,返回多少条数据
1 #数据操作封装函数 2 def my_db(sql,port=3306,charset='utf8'): 3 import pymysql 4 host,user,passwd,db = '192.168.174.128','root','123456','zuoye' 5 coon = pymysql.connect(user = user, 6 host = host, 7 port= port, 8 passwd = passwd, 9 db=db, 10 charset=charset 11 ) 12 13 cur = coon.cursor(cursor=pymysql.cursors.DictCursor)#建立游标,指定cursors类型返回的是字典 14 # 建立游标的时候指定游标类型,返回的就是一个字典 15 cur.execute(sql)#执行sql 16 if sql.strip()[:6].upper()=='SELECT': 17 # fileds = [] 18 # for filed in cur.description: 19 # fileds.append(filed[0]) 20 fileds = [filed[0] for filed in cur.description]#这一行代码与上面三行的是一样的 21 print(fileds) 22 res = cur.fetchall()#获取到这个sql执行的全部结果[['1','2']] [{},{}]他把数据库表里面的每一行数据放到一个list里面 23 # res = cur.fetchone()#获取到这个sql执行的一条结果,他返回就只是一条数据 24 #如果sql语句执行的结果是多条数据的时候那么就用fetchall() 25 #如果你能确定sql执行的结果就只有一条,那么就用fetchone() 26 #cur.fetchmany()#能传入一个个数,返回多少条数据 27 else: 28 coon.commit() 29 res = 'ok' 30 cur.close() 31 coon.close() 32 return res 33 res=my_db('select * from students limit 10;') 34 print(res)
6接口开发
1 #__name__ #代表当前这个Python文件 2 server = flask.Flask(__name__)#把当前这个Python文件,当做一个服务 3 4 def my_db(sql): 5 import pymysql 6 coon = pymysql.connect( 7 host='118.24.3.40', user='jxz', passwd='123456', 8 port=3306, db='jxz', charset='utf8') 9 cur = coon.cursor() #建立游标 10 cur.execute(sql)#执行sql 11 if sql.strip()[:6].upper()=='SELECT': 12 res = cur.fetchall() 13 else: 14 coon.commit() 15 res = 'ok' 16 cur.close() 17 coon.close() 18 return res 19 20 21 22 @server.route('/index',methods=['get','post'])#默认methods这个参数不写,默认是get请求 23 def index(): 24 res = {'msg':'这是我开发的第一个接口','mag_code':0} 25 return json.dumps(res,ensure_ascii=False) 26 27 28 @server.route('/reg',methods=['post'])#代表用post请求 29 def reg(): 30 username= flask.request.values.get('username') 31 pwd= flask.request.values.get('passwd') 32 if username and pwd: 33 sql = 'select * from my_user where username = "%s";'%username 34 if my_db(sql): 35 res = {'msg':'用户已存在','msg_code':2001} 36 else: 37 insert_sql = 'insert into my_user(username,passwd,is_admin) values ("%s","%s",0);'%(username,pwd) 38 my_db(insert_sql) 39 res = {'msg':'注册成功','msg_code':0} 40 else: 41 res = {'msg':'必填字段,请查看接口文档','msg_code':1001}#1001必填字段未填 42 return json.dumps(res,ensure_ascii=False) 43 44 45 server.run(port=666,debug=True,host='0.0.0.0')#设置端口号,debug=True:改了代码之后,不用重启。自己帮我们重启 46 # host = 0.0.0.0 表示别人访问的时候,用你的ip就可以访问了
7.操作redis
1 # redis存到内存里面,电脑重启时就会没有,所以没办法持久化 2 # redis本身性能是非常好的,每秒支持30w次读写 3 import redis 4 r = redis.Redis(host='118.24.3.40',password='HK139bc&*',db=1,port=6379) 5 #增删改查 6 r.set('flower','美') #数据库里面新增一个值 7 #修改也是set 8 r.delete('flower') 9 r.setex('py3','hahah',20)#设置key的失效时间,最后这个参数是秒 10 test = r.get('flower') 11 print(test.decode()) 12 print(r.get('dsdsdsd')) #get一个什么都不存在的字符串返回一个NOne 13 s= '美女' 14 s.encode() #把字符串转为二进制 15 hwt = b'sdsadsad' 16 hwt.decode()#把bytes类型转为字符串 17 18 #获取值 19 print(r.keys())#获取到所有key 20 print(r.keys('f*'))#写参数代表查询以f开头的所有key 21 print(r.keys('*f'))#写参数代表查询以f结尾的所有key 22 23 r.set('天蝎座:admin','聪明')#只要key里面有冒号的,冒号前面的就是文件夹的名字,冒号必须是英文类型 24 # # 多个文件夹,就是往后面直接冒号即可 25 r.set('天蝎座:admin:admin1','聪明') 26 27 for k in r.keys():#删除所有的key 28 r.delete(k) 29 30 #上面的操作都是针对string类型 31 32 33 #下面的是哈希类型 hash 就和嵌套字典一样 34 r.hset('stu_1','admin','胖喂喂喂二翁翁翁翁无') 35 print(r.type('stu_1'))#查看key是什么类型 36 #获取值 37 print(r.hget('stu_1','admin').decode()) #指定大key和小key获取对应的数据 38 39 print(r.hgetall('stu_1'))#获取里面的所有key和value 40 res = r.hgetall('stu_1') 41 new_res = {} 42 for k,v in res.items(): 43 new_res[k.decode()]=v.decode() 44 print(new_res) 45 46 r.hdel('stu_1','admin')#删除指定的key 47 r.delete('stu_1')#删除整个key 48 print(r.ttl('stu_1'))#获取失效时间 49 r.expire('stu_1',100)#对一个key设置失效时间 50 51 52 #1.链接数据库,插到数据库里面所有的数据,游标类型要用pymysql.cursors.DictCursor 53 #2.查询所有数据 54 #3.循环list。取到username,把username当成key 55 #4.再把这个小字典转成json,存进去就ok 56 57 import pymysql 58 import json,redis 59 r = redis.Redis(host='118.24.3.40',password='HK139bc&*',db=1,port=6379) 60 coon = pymysql.connect( 61 host='118.24.3.40',user='jxz',passwd='123456', 62 port=3306,db='jxz',charset='utf8' 63 ) 64 cur = coon.cursor(cursor=pymysql.cursors.DictCursor) #建立游标 65 cur.execute('select * from my_user;') 66 res = cur.fetchall() #获取所有返回的结果 67 for i in res: 68 k = i.get('username') 69 r.hset('stu_info_y',k,json.dumps(i)) 70 cur.close()#关闭游标 71 coon.close()#关闭连接
.