• PYTHON自动化Day7-补充数据库,操作excel,redis操作 ,接口开发


    补充数据库方法:

    import pymysql
    
    def mysql(sql):
        conn = pymysql.connect(
            host='118.24.3.40', user='jxz', passwd='123456',
            port=3306, db='jxz', charset='utf8'
        )
        # cur = conn.cursor()  #建立游标
        cur=conn.cursor(cursor=pymysql.cursors.DictCursor)  #指定cur类型,返回字典
        cur.execute(sql)
        if sql.strip()[:6].upper()=='SELECT':
            # print(cur.description)  #获取表头信息
            res=''
            # res = cur.fetchall()  #得到所有结果
            # res=cur.fetchone()  #得到一条结果
            # res2 = cur.fetchone()
            # res3 = cur.fetchone()
    
            # fileds=[]
            # for filed in cur.description:
            #     fileds.append(filed[0])
            fileds=[filed[0] for filed in cur.description] #列表生成式 和上面三行作用相同, 获取表头中的列名
            print(fileds)
        else:
            conn.commit()
            res=1
        cur.close()  # 关闭游标
        conn.close()  # 关闭连接
        return res
    
    sql = 'select * from stu;'
    #写sql语句时需要使用占位符,不能直接在sql语句里面写变量名
    res=mysql(sql)
    print(res)

    一.写excel:

    import xlwt
    book = xlwt.Workbook()              #新建一个excel
    sheet = book.add_sheet('sheet1')    #加sheet页
    sheet.write(0,0,'姓名')              #行、列、写入的内容
    sheet.write(0,1,'年龄')
    sheet.write(0,2,'性别')
    
    book.save('stu.xls')                #必须以.xls结尾

    二.通用从数据库取数据导出到excel:

    import pymysql,xlwt
    def export_excel(table_name):
        host, user, passwd, db = '118.24.3.40', 'jxz', '123456', 'jxz'
        coon = pymysql.connect(user=user, host=host, port=3306, passwd=passwd, db=db, charset='utf8')
        cur = coon.cursor()  # 建立游标,指定cursor类型返回的是字典
        sql = 'select * from %s ;'%table_name
        cur.execute(sql)  # 执行sql
        fileds = [filed[0] for filed in cur.description]  #所有的字段
        all_data = cur.fetchall()
        book = xlwt.Workbook()
        sheet  = book.add_sheet('sheet1')
        for col,filed in enumerate(fileds):   #写表头的   enumerate 分别取出每个元素的位置和value
            sheet.write(0,col,filed)
        row = 1  #行数
        for data in all_data:  #
            for col, filed in enumerate(data):  # 控制列
                sheet.write(row, col, filed)
            row+=1#每次写完一行,行就加1
        book.save('%s.xls'%table_name)
    export_excel('app_student')

    三.读excel:

    import xlrd
    book = xlrd.open_workbook('app_student.xls')
    sheet = book.sheet_by_index(0) #获取到第几个sheet页
    sheet2 = book.sheet_by_name('shee1')  #根据名字获取到sheet页
    print(sheet.cell(0,0))  #指定sheet页里面行和列获取数据 ,会包含type
    print(sheet.cell(0,0).value) #指定sheet页里面行和lie获取数据,只有数据,没有type
    print(sheet.cell(1,0).value) #指定sheet页里面行和lie获取数据
    print(sheet.row_values(0)) #这个获取到第几行的内容
    print(sheet.row_values(1)) #这个获取到第几行的内容
    print(sheet.nrows) #获取到excel里面总共有多少行
    for i in range(sheet.nrows):  #循环获取到每行数据
        print(sheet.row_values(i))
    print(sheet.ncols)  #总共多少列
    print(sheet.col_values(0)) #取第几列的数据

    四.修改excel:

    import xlrd
    from xlutils import copy
    book = xlrd.open_workbook('stu.xls')
    #先用xlrd模块,打开一个excel
    new_book = copy.copy(book)
    #通过xlutils这个模块里面copy方法,复制一份excel
    sheet = new_book.get_sheet(0) #获取sheet页
    lis = ['编号','名字','性别','年龄','地址','班级','手机号','金币']
    for col,filed in enumerate(lis):
        sheet.write(0,col,filed)
    
    new_book.save('app_student.xls')

    五.redis操作:

    import redis
    
    r = redis.Redis(host='118.24.3.40',password='HK139bc&*',db=6,port=6379)
    
    #增删改查
    r.set('niuhanyang','帅!') #数据库里面新增一个值
    # 修改也是set
    r.delete('niuhanyang')
    r.setex('python_123','哈哈哈',20)  #设置key的失效时间,最后这个参数是秒
    hwt = r.get('hwt')
    print(hwt.decode())
    print(r.keys('*xxx*'))#获取到所有的key
    print(r.get('sdfsdf'))
    r.set('天蝎座:mpp','呵呵呵')
    r.get('天蝎座:mpp')
    
    # 上面操作都是针对 string类型
    for k in r.keys():  #删除所有的key
        r.delete(k)
    
    # 哈希类型  hash   嵌套字典
    r.hset('stu_info','刘伟','1m8 100w存款')
    r.hset('stu_info','张流量','浪,为了不交作业,故意让狗咬他')
    r.hset('stu_info','董春光','为了不交作业,找了一条狗咬张流量,然后陪张流量去医院')
    print(r.hget('stu_info','张流量').decode())  #指定大key和小key获取对应的数据
    print(r.hgetall('stu_info'))  #获取里面所有的k和-v
    stu_info  = r.hgetall('stu_info')
    r.hdel('stu_info','gyx')  #删除指定key
    r.delete('stu_info')  #删除整个key
    r.expire('aaa',100) #第一个key设置失效时间
    new_stu_info = {}
    for k,v in stu_info.items():
        new_stu_info[k.decode()] = v.decode()
    print(new_stu_info)
    
    print(r.type('stu_info'))  #查看key是什么类型的
    print(r.type('zll'))
    
    
    s='呵呵'
    s.encode() #把字符串转成二进制
    hwt = b'sdfsdfsdf'
    hwt.decode()  #把bytes类型转成字符串
    
    #pymysql、json、redis
    #1、连数据库,查到数据库里面所有的数据,游标类型要用pymysql.curosrs.DictCour
    #2、查到所有数据   [ {"id":1,"passwd":"49487dd4f94008a6110275e48ad09448","username":"niuhayang","is_admin":1}]
    #3、循环这个list,取到usernamer,把username当做key
    #4、再把这个小字典转成json,存进去就ok。
    import pymysql,json,redis
    r = redis.Redis(host='118.24.3.40',password='HK139bc&*',db=1,port=6379)
    conn = pymysql.connect(host='118.24.3.40',user='jxz',passwd='123456',db='jxz',charset='utf8')
    cur = conn.cursor(cursor=pymysql.cursors.DictCursor)
    cur.execute('select * from my_user;')
    all_data = cur.fetchall()
    for data in all_data:
        k = data.get('username')
        r.hset('stu_info_nhy',k,json.dumps(data))
    cur.close()
    conn.close()

    六.接口开发:

    import flask,json
    import pymysql
    # __name__,代表当前这个python文件
    server=flask.Flask(__name__)  #把当前这个python文件,当做一个服务
    
    def mysql(sql):
        conn = pymysql.connect(
            host='118.24.3.40', user='jxz', passwd='123456',
            port=3306, db='jxz', charset='utf8'
        )
        # cur = conn.cursor()  #建立游标
        cur=conn.cursor(cursor=pymysql.cursors.DictCursor)  #指定cur类型,返回字典
        cur.execute(sql)
        if sql.strip()[:6].upper()=='SELECT':
            res = cur.fetchall()  #得到所有结果
        else:
            conn.commit()
            res=1
        cur.close()  # 关闭游标
        conn.close()  # 关闭连接
        return res
    
    
    #ip:8000/index?uge
    @server.route('/index',methods=['get'])   #@server.route 装置器 生成一个接口, methods=['get','post']  可以写多个,支持多个请求,如果不写,默认是get请求,接口返回的都是json格式
    def index():
        res={'msg':'这是我开发的第一个接口','msg_code':0}
        return json.dumps(res,ensure_ascii=False)  #返回json串,ensure_ascii=False添加后,可以显示为中文  dumps和dump区别,dump是操作文件的,
    
    server.run(port=7777,debug=True)  #启动接口服务  debug=True,改了代码之后,不用重启就会生效,[如果直接运行,会再打开一个服务,所以注意一定要stop掉一个之后再运行脚本]
    
    @server.route('/reg',methods=['post'])
    def reg():
        username=flask.request.values.get('username')  #flask.request 所有用户输入过来的信息, values.get获取信息
        pwd=flask.request.values.get('passwd')
        if username and pwd:
            sql='select *from my_user where username="%s";' %username
            if mysql(sql):
                res={'msg':'用户名已存在','msg_code':2001}
            else:
                insert_sql='insert into my_user (username,passwd,is_admin) values ("%s","%s",0);' %(username,pwd)
                mysql(insert_sql)
                res={'msg':'注册成功','msg_code':0}
        else:
            res={'msg':'必填字段未填','msg_code':1001}
    
        return json.dumps(res,ensure_ascii=False)
    server.run(port=7778,debug=True,host='0.0.0.0')  #指定了host,其他人也可以通过ip地址访问了,改动需要重启

    七.自己开发一个api:

    。。。

    笔记:

    os.walk()  #列出路径下所有文件
    os.listdir()  #只能列出路径下的一层文件和文件夹
    os.system('ifconfig')  #只执行命令
    os.popen() # 执行命令,并获取到结果
    os.popen('ifconfig').read()  #得到执行结果
    
    md5
    hashlib
    md=hashlib.md5()  #实例化
    md.update(s.encode())
    md.hexdigest() #得到加密结果
    
    
    pymysql,pyoracle
    conn=pymysql.connect(host,pwd,port,db,charset='utf8')
    cur=conn.cur()
    cur.execute(sql)
    conn.commit()
    cur.fectall() #取结果
    cur.close()
    conn.close()
    
    
    excel xlwt
    xls=xlwt.Workbook()
    sheet=xls.add_sheet('sheet')
    sheet.write(0,0,'id')
    xls.save('stu.xls')
    
    今天:
    1.补充操作数据库
        fetchall()  #获取到这个sql的全部执行结果
        fetchone()  #获取到这个sql的一条结果
        如果sql语句的执行结果是多条数据的时候,就用fetchall
        如果你能确定sql执行的结果只有一条,就用fetchone
    
        还有一个fetchmany() #传入一个数,返回多少条数据
    
        cur=conn.cursor(cursor=pymysql.cursors.DictCursor)  #指定游标类型,返回字典类型
    
        enumerate([list,list2]) #循环的时候,直接取到下标
    
    2、操作redis
        redis也是一个数据库。
        关系型数据库
            mysql、oracle、sql server、db2、sqlite
            sql
            数据存在磁盘上
        非关系型数据库
            没有
            sql
            get('k')
            set('xx')
            mongodb、redis
    
            redis数据全部都是存在内存里面。速度快,但是,重启就不见了,要实现redis数据持久化,重启前把数据保存到磁盘上,重启后再恢复
                redis本身性能是非常好的,每秒支持30w次的读写。
    
        牛牛的redis:118.24.3.40
                    6379
                    HK139bc&*
    
    
    3.开发接口
        1.mock接口,在需要其他接口返回数据时,接口还没有开发好,可以先写一个mock模拟接口来返回值用于当前接口测试
    flask是一个轻量级的接口开发框架
        4.异常处理 作业: 1、修改excel,把app_student.xls里面的数据, 1、如果这一行数据里面有乱码,那么就给他删掉 2、再加上一列,是否毕业 3、如果班级是天蝎座的话,毕业这一列写成毕业 4、其他班级的写成未毕业 2、 1、改写注册接口的: 1、改写我的注册接口,让它的密码存成密文的。 2、数据不再存在mysql里面,存到redis里面,redis的key就用string类型 3、niuhanyang 7869d295e566295b51eec5d6bed67c14 4、校验用户是否存在 user:niuhanyang 2、参照接口文档上 http://doc.nnzhp.cn/index.php?s=/6&page_id=12 登录接口 登录成功之后,返回seesionid,用户登录时间 sessionid 用户名+当前的时间戳 md5,seesion失效时间是60分钟 sessionid:niuhanyang {"seessionid":a5dfcb047721e02a6f8bff779c815165,"login_time":201805051820} 如果这个用户已经登录过了,那么就返回他的seesionid,登录时间 给多个变量赋值: host,user,passwd,db='192.22.2.2','jxm','234567','dvd'
  • 相关阅读:
    python os.path模块常用方法详解
    PHP脚本执行效率性能检测之WebGrind的使用
    Laravel操作上传文件的方法
    Nginx获取自定义头部header的值
    Laravel Nginx 除 `/` 外所有路由 404
    laravel查看执行的sql语句
    laravel 安装excel扩展
    mysql 按值排序
    处理laravel表单提交默认将空值转为null的问题
    设置虚拟机里的Centos7的IP
  • 原文地址:https://www.cnblogs.com/lilyzhang-2018/p/9923501.html
Copyright © 2020-2023  润新知