zoukankan      html  css  js  c++  java
  • 操作redis数据库 & 操作Excel & 开发接口


    操作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}
  • 相关阅读:
    jq获取地址中的参数的值
    移动设备分辨率
    随机生成颜色
    小程序轮播图
    JavaScript中的constructor、instanceof、isPrototypeOf、typeof以及hasOwnProperty
    call()和apply()函数
    行内元素和块级元素
    js跳出循环的方法区别(break,continue,return)
    js 的四种设计模式的优缺点
    常见浏览器兼容性问题与解决方案
  • 原文地址:https://www.cnblogs.com/fangfangzhang/p/10162580.html
Copyright © 2011-2022 走看看