Python-操作excel&操作redis
1.操作excel
# 写入excel
import xlwt # 导入模块(写入excel)
book = xlwt.Workbook() # 新建一个excel
sheet = book.add_sheet('111') # 给sheet起名
sheet.write(0,0,'姓名') # 第一个0是行,第二个0是列
sheet.write(0,1,'成绩')
book.save('stu.xls') # 保存
# 读取excel
import xlrd # 导入能够读取excel的模块
book = xlrd.open_workbook(r'C:\Users\Administrator\Desktop\22.xls') # 打开一个excel,xlrd模块中的打开sheet页的方法
sheet = book.sheet_by_index(0) # 打开第1个sheet
print(sheet.row_values(0)) # 获取第一行的数据
print(sheet.col_values(0)) # 获取第一列的数据
print(sheet.cell(0,0).value) # 获取第一行第一列单元格的数据
print(sheet.nrows) # 获取总共有多少行
print(sheet.ncols) # 获取总共有多少列
for i in range(sheet.nrows): # 获取文件所有内容
print(sheet.ncols)
# 修改excel
# 步骤:用xlrd模块打开excel--用xlutils模块里的copy复制一份--获取sheet页--修改
import xlrd
from xlutils import copy # 导入模块
book = xlrd.open_workbook('students.xls')
new_book = copy.copy(book) # 复制这个excel
sheet = new_book.get_sheet(0) # 打开第一个sheet页,xlutils模块中的打开sheet页的方法
sheet.write(0,6,'年龄阶段') # 在第一行第五列写入内容
new_book.save('students.xls') # 保存
# 练习
'''
练习:将students.xls文件中的内容根据年龄划分年龄阶段,在表格最后加一列
年龄小于18岁的,未成年,大于18岁小于30岁的,年轻人,大于30岁的人 中年人
'''
import xlrd
from xlutils import copy
book = xlrd.open_workbook('students.xls')
sheet0 = book.sheet_by_index(0) # 获取原来的数据
new_book = copy.copy(book) # 复制这个excel
sheet = new_book.get_sheet(0) # 打开复制后的excel
sheet.write(0,6,'年龄阶段') # 写入表头
for i in range(1,sheet0.nrows): # 从第一行开始循环读取原来的数据
age = sheet0.row_values(i)[3] # 获取age的值
if age<18:
word = '未成年'
elif age>=18 and age<=30:
word='年轻人'
else:
word = '中年人'
sheet.write(i,6,word) # 写入excel
new_book.save('students.xls') # 保存
2.操作redis
redis是一个非关系型数据库,没有表,没有sql语句;使用key,value形式存储
非关系型数据库性能比关系型数据库更好
非关系型数据库:redis、mongdb、memccache等
redis数据存在内存中,性能非常好
import redis # 导入redis模块
host = 'XXX.XXX.XXX.XXX' # redis数据库地址
passwd = 'XXXXX' #redis数据库密码
conn = redis.Redis(host=host, password=passwd, db=5, decode_responses=True) # 连接数据库
# 若数据库不存在,会创建,默认端口号为6379,可以使用port参数修改
# 连接redis,db表示操作第几个数据库(0-15),不写此参数,默认第0个,decode_responses=True表示将返回的数据转成字符串类型
# 写入数据为String类型
conn.set('hxn','123456') # 新增和修改数据(hxn为key,123456为value),此写法只要电脑不重启,则一直存在于内存中
conn.set('hxn11','6666',10) # 新增和修改数据,10表示只存在内存中10秒
result = conn.get('hxn') # 获取key为hxn的数据,获取到的数据为byte类型(二进制)
result.decode() # 将byte类型(二进制)转化为字符串类型,可以直接使用decode_responses参数
conn.delete('hxn') # 删除指定key数据
conn.flushdb() # 清除当前数据库所有的key数据
conn.flushall() # 清除所有数据库里面所有的key数据
conn.keys() # 获取当前数据库所有的key
conn.type(key) # 查看key的类型
conn.set('szz:zhangsan','{"addr":"tiantongyuan"}')
conn.expire(key,100) # 设置key的失效时间,100是失效时间
# szz:zhangsan表示key值,因为冒号,在redis中会层级显示,只是显示上的区别,其余没有区别
# 上述使用的函数,也同时是redis的操作命令(删除是del)
# 写入数据为hash类型
# hash大致格式:key1{key2:walue,key3:value}
conn.hget('szz_stu','hxn') # 获取数据
conn.hset('szz_stu','hxn','1111111') # 新增修改数据
conn.delete('szz_stu','hxn') # 删除数据
conn.hgetall('szz_stu') # 获取szz_stu里面的所有key
conn.hmset('key1,{key2:walue,key3:value}') # 批量写入hash数据
conn.ttl(key) # 获取一个key的失效时间--整体方法(非hash类型独有)
# 管道(批量操作数据时,使用管道可以优化性能)
p = conn1.pipeline() # 新建一个管道
p.set('abc','aa') # 写入数据
p.get() # 获取数据
p.hget() # hash类型,获取数据
p.execute() # 执行
# 练习:将a redis的数据迁移到b redis中
'''
1、连接两个redis
2、获取aredis里面的说有key
3、判断key的类型,若是string类型,则使用get获取和set写入,若是hash类型,则使用hgetall获取和hsetall写入
'''
import redis # 导入redis模块
host = 'XXX.XXX.XXX.XXX' # redis数据库地址
passwd = 'XXXXXX' #redis数据库密码
conn1 = redis.Redis(host=host, password=passwd, db=5, decode_responses=True, port=6378)
for k in conn.keys():
if conn.type(k) == 'string':
value = conn.get(k)
conn1.set(k, value)
elif conn.type(k) == 'hash':
value = conn.hgetall() # 首先获取到hashkey里面的所有数据
conn1.hmget(k, value) # 然后把所有的数据set进去