操作redis数据库:

string类型

1. 增 set,传俩个参数 key  value(只要是字符串就行)
2. 删 delete 传一个参数 key
3. 修改 set 在目标key重新传参 key value
4. 查 get
import redis
ip = 'xxxxxx'
password='xxxxxx'
r = redis.Redis(host=ip,password=password,port=6379,db=10,
decode_responses=True)#连接redis,加入decode_responses=True后,传回的就不是betes类型了,而是字符串。
r2 = redis.Redis(host=ip,password=password,port=6378,db=10, decode_responses=True)#连接redis
#增 set, key value
r.set('nhy_sessionn','sdfsdfssdf234sfdfsdsdfs',) 
r.set('nhy_info','{"name":"xxxx","password":"123456","account":11234}') #value只要是字符串就行
#查
res = r.get('nhy_info') #返回key为nhy_info的值,是bytes类型
print('bytes..',res)
print('zifuchuan..',res.decode()) #decode()是bytes变字符串内置函数
s.encode() #字符串变成bytes
#删除
r.delete('nhy_info') #删一个不存在的key,返回0
r.flushall() #清空所有数据库里面的数据
r.flushdb() #只清空当前数据库里面的数据 print(r.keys()) #获取到所有的key
print(r.keys('*session*')) #模糊匹配含有session的关键词 r.set('名称','小明',10)#添加10,即10秒后失效 r.set('qml_session','sdfsdfsdfss')#
r.expire('qml_session',30) #追加过期时间 print(r.get('名称')) #查key的值
# 哈希类型
r.hset('sms_code','18612532945','121213') #增加值,俩层key
r.hset('sms_code','18612532941','121313') #增加值,俩层key,第一个参数跟上边那个一样 print(r.hget('sms_code','18201034732')) #获取值,要输入俩层key
print(r.hgetall('sms_code')) #返回一个字典k=v r.hdel('sms_code','18201034732') #删除指定的key值
r.delete('sms_code') #把整个key删除掉 print(r.type('sms_code')) #返回hash
print(r.type('lyl_session007')) r.set('yulin:xxx','{"username":"yulin"}')#第一层key的值,json
牛刀小试——迁移redis
需求&思路:
1、把现在这个redis数据库里面的数据全部整到另外一个redis里面
# a 有数据
# b 空
要把a redis里面的数据 全部到迁移到b redis
# 1、连上2个redis
# 2、先从a redis里面获取到所有key
# 3、然后判断key是什么类型,根据类型来判断使用什么方法写入
# 4、从a redis里面获取到数据,set 到b redis里面
import redis
ip = '118.24.3.40'
password='HK139bc&*'
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() #从r拿到所有的key
for k in all_key:
if r.type(k) == 'string': #判断key的类型,选择对应的set方式
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)
tools.py文件:
import time
import os
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):
print('调用了')
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)) import pymysql
def my_db(sql):
conn = pymysql.connect(host='xxxxxx',user='xxxxxx',password='xxxxxx',
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()
if __name__ == '__main__':
#判断如果是在别的文件里面导入这个python文件的话,就不执行下面的代码
print(strTotimestamp())
print(clean_log('.'))
print(clean_log('.',2))

模块导入顺序:

导入自己写的tools.py模块,标红没关系,其实没有错,是pyharm没那么智能,识别不到而已。可以手动加入到环境变量中,就不标红了

手动加入:
手动加入到环境变量:右击目标文件—mark directory as—source root,然后就可以直接用子目录下的模块,不需再‘文件名.然后函数名’使用
手动加入到环境变量后,文件会变蓝。而且也不变红了。下次打开pycharm还能使用。
import 导入一个模块的实质就是把这个python文件从头到尾执行一次。
# 1. 直接导入文件名儿,里边的函数要用 ‘文件名.函数()’
import my
print(dir(my))
print(my.sayName()) # 2. 从文件名儿里边导入函数,可以直接用函数
from my import sayName
print(sayName())

import 查找顺序:

1. 当前目录
2. sys.path(python安装的目录)
如果当前目录和其他目录有一个一样的文件名,出来是当前目录的
import sys
print(sys.path)
sys.path.append(r'/Users/nhy/PycharmProjects/tcz/day6')
sys.path.insert(0,r'/Users/nhy/PycharmProjects/tcz/day6')
print(sys.path)

修改Excel

import xlrd #引入表格读模块

from xlutils import copy

#1、先打开原来的excel
#2、复制一份
#3、在复制的excel上修改
#4、保存 book = xlrd.open_workbook('stu3.xls') #打开表格
new_book = copy.copy(book) #复制一份
sheet = new_book.get_sheet(0) #修改excel的时候,得用get_sheet()找到sheet, 不再是sheet_by_index(0)
sheet.write(0,0,'id') sheet.write(0,3,'password') new_book.save('stu3.xls')

写excel

import xlwt #引入表格写模块

book = xlwt.Workbook() #新建一个excel
sheet = book.add_sheet('sheet1') #添加一个sheet页 #这种方法效率不高
sheet.write(0,0,'编号') #在A1写上‘编号’
sheet.write(0,1,'名字') #在B1写上‘名字’
sheet.write(0,2,'性别') sheet.write(1,0,'1')
sheet.write(1,1,'马春波')
sheet.write(1,2,'男') #把二维数组里的内容写到表格中:
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','男','北京'],
]
#11行5列,下边这样写效率还很慢:
row = 0 #第一行
for stu in stu_info:
sheet.write(row,0,stu[0])
sheet.write(row,1,stu[1])
sheet.write(row,2,stu[2])
sheet.write(row,3,stu[3])
sheet.write(row,4,stu[4])
...
row+=1 #这样写稍微快一点:
row = 0 #行
for stu in stu_info: #stu
col = 0 # 列 # [1, 'machunbo', 'sdfsd23sdfsdf2', '男', '北京'],
for s in stu: #控制列
sheet.write(row,col,s) #0 3 男
col+=1
row+=1 #这样写效率最高:引用enumerate内置函数
for index,value in enumerate(stu_info): #同时取下标和值
for index2,v2 in enumerate(value):
print(index,index2,v2)
sheet.write(index,index2,v2) book.save('stu3.xls') #wps xls xlsx ,微软的office 用 xls

接口开发

注意:添加debug=True,修改代码后会自动运行,不能再点击运行了,只能刷新
可以用自己电脑的IP登录,自己电脑还能用返回的127.0.0.1 登录。要想别人登录,改为host='0.0.0.0'
import flask #引入接口模块,flask烧瓶的意思
import tools #自己写的脚本tools里面有my_db和my_md5函数
import json server = flask.Flask(__name__)#新建一个服务,把当前这个python文件当做一个服务 @server.route('/login',methods=['get']) #接口路径,请求方式
def hello(): #登录函数
uname = flask.request.values.get('username')#要求传参
pd = flask.request.values.get('passwd')
sql = 'select * from app_myuser where username="%s"'%uname #从数据库选择用户名为uname的数据
res = tools.my_db(sql)
if res: #如果存在uname这个用户,即返回了值
if tools.my_md5(pd) == res.get('passwd'): #fetchone取回一个数据{‘username’:'nhy','passwd':'123456'}。字典的get方法查值,不会报错,key不存在是返None
res = {"code":0,"msg":"登录成功!"}
else:
res = {"code":1,"msg":"密码错误!"}
else:
res = {'code':2,"msg":"用户不存在"}
return json.dumps(res,ensure_ascii=False,indent=4) #把字典变成json,方便储存,再拿出来用方便。而且必须有返回值 @server.route('/reg',methods=['post']) #登录代码
def reg():
uname = flask.request.values.get('username')
pd = flask.request.values.get('passwd')
cpd = flask.request.values.get('cpwd')
server.run(host='0.0.0.0',port=8999,debug=True) #运行这个服务
#ip:8000/login
#127.0.0.1

读取excel

import xlrd #引入表格读模块
book = xlrd.open_workbook('stu3.xls') #打开表格
sheet = book.sheet_by_index(0) #通过索引找到第一个表
sheet = book.sheet_by_name('sheet1') #通过名称找到第一个表 print(sheet.cell(0,0).value) #获取表中指定单元格A1的内容
print(sheet.cell(1,0).value)#获取表中指定单元格B1的内容
print(sheet.row_values(0)) #获取整行的数据
print(sheet.row_values(1))
print(sheet.col_values(0))#获取整列的数据
print(sheet.col_values(1)) print(sheet.nrows) #行数 number of rows
print(sheet.ncols) #列数 for row in range(1,sheet.nrows):
print(sheet.row_values(row)) #取每行的值

上周回顾:

    1、内置函数
len
type
max()
sum()
round(5.3212,2)
char() #
ord() #
sorted()
reversed()
res = list(filter(func,[1,2,3,4,5]))
res = list(map(func,[1,2,3,4,5]))
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、模块相关的,导入模块流程、导入的模块的实质
1、import xx
import 一个模块的实质就是把这个python文件从头到尾执行一遍
2、import模块的查找模块的顺序
1、从当前目录下找
2、sys.path
从上面2个目录都找不到,那就报错 2、redis 操作、excel
redis
1.关系型数据库
mysql、oracle、sql server
database
table1 user
table2 account
table3 order
niuhanyang
user_id
sql语句来操作数据
数据是存在磁盘上的 2.非关系型数据库、NOSQL
1、数据是存在内存里面
2、不需要通过sql语句来查询数据
MongoDB
数据也是存在磁盘上的
redis
memcache key = vaule ip:8000/pay?xxx=xxx
3、接口开发
1、mock 服务
2、给别人提供数据
3、 flask web框架
上周作业
# 作业1
#、 写一个函数,传入一个路径和一个关键字(关键字是文件内容),找到文件内容里面有这个关键字的txt文件
# 1、去找到这个目录下面的所有.txt文件
# 2、循环打开所有的txt文件,读到文件内容
# 3、判断关键字是否存在文件里面
import os def find_content(path,key_word):
for cur_path,dirs,files in os.walk(path):
for file in files:
if file.endswith('log'):
print(file)
abs_file_path = os.path.join(cur_path,file)
res = open(abs_file_path,encoding='utf-8').read()
if key_word in res:
print('文件内容在',abs_file_path) #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))
#clean_log(r'/Users/nhy/PycharmProjects/tcz/day6')
#find_content(r'/Users/nhy/PycharmProjects/tcz','函数')
# print(os.listdir('/Users/nhy')) #登录、注册 import pymysql
def my_db(sql):
conn = pymysql.connect(host='xxxxxx',user='xxxxxx',password='xxxxxx',
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('错误次数过多!')
# login()
本周作业:
1、写一个函数,实现,传入一个表名,把这个表里面的所有数据导出到excel里面
def data_to_excel(table_name):
pass
book.save(table_name.xls)
2、写一个函数,把app_myuser 这个表里面的数据全放到redis里面
key的样式 :qml:wangcan1
redis key的类型用 string、hash都型
下面是存到redis里面的数据格式
wangcan1 {"id":1,"username":"wangcan1","password":"8b634156edde77e407764d5166e34d20","is_admin":1}
wangcan2 {"id":1,"username":"wangcan1","password":"8b634156edde77e407764d5166e34d20","is_admin":1}
wangcan3 {"id":2,"username":"wangcan1","password":"8b634156edde77e407764d5166e34d20","is_admin":1} 3、改造登录接口,用户数据从redis里面取 4、注册接口,注册完之后,用户信息写到redis里面,要判断用户是否存在,密码存密文
yulin:yulin {"id":1,"username":"wangcan1","password":"8b634156edde77e407764d5166e34d20","is_admin":1}

操作redis数据库 & 操作Excel & 开发接口的更多相关文章

  1. Python之操作redis数据库

    使用redis模块 一.操作redis 1.添加信息 (1)直接建key-value信息: 右键-Add New Key,手动添加key和value 右键-Console,打开控制台,写入命令 (2) ...

  2. Linux+Redis实战教程_day02_3、redis数据类型_4、String命令_5、hash命令_6、java操作redis数据库技术

    3. redis数据类型[重点] redis 使用的是键值对保存数据.(map) key:全部都是字符串 value:有五种数据类型 Key名:自定义,key名不要过长,否则影响使用效率 Key名不要 ...

  3. redis python 操作 Python操作Redis数据库

    原文章于此:https://www.cnblogs.com/cnkai/p/7642787.html 有个人修改与改正 Python操作Redis数据库   连接数据库 StrictRedisfrom ...

  4. 高级运维(六):源码安装Redis缓存服务、常用Redis数据库操作指令、配置Redis主从服务器

    一.源码安装Redis缓存服务 目标: 本案例要求先快速搭建好一台Redis服务器,并测试该缓存服务器: 1> 设置变量test,值为123 2> 查看变量test的值 3> 设置计 ...

  5. Redis操作,数据库操作

    Redis操作,数据库操作 案例1:源码安装Redis缓存服务 案例2:常用Redis数据库操作指令 案例3:配置Redis主从服务器 1 案例1:源码安装Redis缓存服务 1.1 问题 本案例要求 ...

  6. php redis数据库操作类

    <?php namespace iphp\db; use iphp\App; /** * redis操作类 * 说明,任何为false的串,存在redis中都是空串. * 只有在key不存在时, ...

  7. Jedis(java操作redis数据库技术)

    Redis有什么命令,Jedis就有什么方法. 客户端无法连接时,需要考虑防火墙配置,比如6379端口是否开放,也可以直接关闭防火墙. Jedis连接池: import org.junit.Test; ...

  8. PHP操作Redis数据库常用方法

    Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多种语言的API. Redis支持的数据类型有 Stirng(字符串), Lis ...

  9. java简单操作redis数据库

    package RedisTest; import redis.clients.jedis.Jedis; public class RedisTest { private static String ...

随机推荐

  1. mysql—常用查询语句总结

    关于MySQL常用的查询语句 一查询数值型数据: ; 查询谓词:>,=,<,<>,!=,!>,!<,=>,=< 二查询字符串 SELECT * FROM ...

  2. IntelliJ IDEA 的默认文件编码

    建好项目,首先注意改项目默认编码 File->Settings(快捷键Ctrl+Alt+S)->Editor->File Encodings File->Other Setti ...

  3. MYSQL的学习

    启动MYSQL :net start mysql或者手动启动,输入密码:mysql -u root -p 先创建数据库在创建表格,创建数据库:create databsse 数据库名称,创建表格:cr ...

  4. Groovy中的GString

    在讨论GString之前,我们先讨论一下Groovy里面的String.在Groovy里面String有 println 'test string' println '''test string''' ...

  5. 模拟登陆github

    import requests from lxml import etree class Login(object): def __init__(self): self.headers = { 'Re ...

  6. hibernate之一级缓存

    缓存目的:提高效率. sql语句与数据库交互,返回数据组装成对象存入session缓存中.程序查询时,优先访问缓存中是否存在id相同对象. hibernate中session缓存(一级缓存)存在

  7. python模块------pyinotify

    介绍 pyinotify模块用来监测文件系统的变化,依赖于Linux内核的inotify功能,inotify是一个事件驱动的通知器,其通知接口从内核空间到用户空间通过三个系统调用.pyinotify结 ...

  8. 主成分分析算法(PCA)

    通过数据压缩(降维)可以减少特征数量,可以降低硬盘和内存的存储,加快算法的训练. 还可以把高维的数据压缩成二维或三维,这样方便做数据可视化. 数据压缩是通过相似或者相关度很高的特征来生成新的特征,减少 ...

  9. Python3的保留字

    Python3的保留字 false none true and 表示条件的并列,并且条件全部成立 as assert break class continue def del elif else ex ...

  10. ICMP shell

    场景 反向shell的场景下使用 原理 ICMP作为获取反向shell的通道 实践 运行 run.sh报错,可能是因为用的Parrot.改一下就可以了 ifconfig | grep 'inet '| ...