• day7


    操作mysql补充:将查询到表的数据写入excel
    import pymysql,xlwt
    coon=pymysql.connect(host='xxx.24.3.40',user='jxz',password='123456',db='jxz',charset='utf8')     #连接数据库
    cur=coon.cursor()
    # cur=coon.cursor(cursor=pymysql.cursors.DictCursor)      #指定游标类型,返回的数据是字典
    cur.execute('select * from app_student limit 10;')     #执行sql语句
    # print(cur.description)       #返回表的信息,类型是二元数组(元素1是字段,其余指的是该字段长度、是否必填等约束信息)
    fileds=[ filed[0] for filed in cur.description]      #获取到表所有的字段
    data=list(cur.fetchall())      #将二元数组强制转换成list
    data.insert(0,fileds)      #增加表字段
    book=xlwt.Workbook()
    sheet=book.add_sheet('sheet1')
     
    # 写数据
    # 1、一个一个单元格写,先写第一行的每个单元格
    # 2、写每一行的时候,行号是不变的,列在变
    # 3、嵌套的循环
    方法1:
    line=0 #行号
    for d in data: #外层循环控制行
        col=0 #列号
        for col_data in d: #内层控制列
            sheet.write(line,col,col_data)
            col+=1
        line+=1
    方法2(高端):
    for index,line_data in enumerate(data):
        for index2,col_data in enumerate(line_data):
            sheet.write(index,index2,col_data)
     
    book.save('user.xls')
    cur.close()
    coon.close()
     
     
    sys模块
    import sys
    print(sys.argv)      #在命令行运行python文件时(python xx.py).它会把传入的参数都放到这个argv里面;返回的是一个list;
    在Python中,通过命令运行如下Python文件:
    command=sys.argv
    if len(command)>1:
        excle=command[1]
        print('用例已经运行完成',excle)
    else:
        print('运行这个python文件的时候,需要传入一个用例名称,例如:'
      'python run_case.py case.xls')
    导入模块
    导入模块的顺序:
    1、先在当前目录下找这个python文件
    2、再去python的环境变量里面找这个python文件
    导入模块的实质:
    1.把这个模块的代码,从头到尾执行一次
    print(sys.path)    #查看Python的环境变量
    例1:在当前目录,导入当前目录的其他python文件
    有一个b.py文件如下:
    name= 'haha'
    def coon_db():
    print('this is a func..')
    print('这是最后一段代码')
    if __name__ == '__main__': #下面代码为测试代码,在其他Python文件导入这个模块,它不会执行
    coon_db('b文件')       #测试代码
    在a文件中导入b文件-方法1:
    import b   #在a文件里导入b文件
    b.coon_db()  #调用b文件里的my函数
    print(b.name) #调用b文件里的name变量
    在a文件中导入b文件-方法2:
    from b import coon_db,name #只导入b文件里的coon_db函数和变量name
    coon_db()
    print(name)
     
    例2:在当前目录,导入其他目录的python文件
    1.把要导入模块的目录加入到环境变量里面
    import sys
    sys.path.append(r'E:spz ools')  #加入环境变量,加在最后
    sys.path.insert(0,r'E:spz ools')   #加入环境变量:加入在指定位置
    print(sys.path)    #查看环境变量里面的所有目录
     
    操作mongodb
    import pymongo
    client=pymongo.MongoClient(host='xxx.24.3.40',port=27017) #连接
    db=client['ht_spz']#选择数据库,如果这个数据库不存在的话,会帮你创建
    collection=db['stu_info']#选择一个集合,相当于mysql里面的表;如果集合不存在,会帮你创建
    增:
    collection.insert({'name':'nhy','sex':'男'}) #往集合里面插入数据
    collection.insert({'url':'http://www.baidu.com','title':'baidu.com','addr':'西二旗'})
    查:
    方法1:
    for d in collection.find({'title':'baidu.com'}):
        print(d)
    方法2:
    print(list(collection.find({'title':'baidu.com'}))) #查找集合里面,指定数据
    print(list(collection.find())) #查找集合里面,所有数据
    删:
    collection.delete_one({'title':'baidu.com'}) #如果有多条的话,只会删除一条
    collection.delete_many({'title':'baidu.com'}) #如果有多条的话,会删除多条
    改:
    collection.update({'name':'nhy'},{'name':'nhy','addr':'亦庄'})
     
    接口开发
    1.更好的测试
    2.mock(模拟接口)
    3.给别人提供数据
    import flask
    server=flask.Flask(__name__) #启动服务,把当前这个Python文件当做一个服务
    @server.route('/login',methods=['get','post'])
    def login():
        return 'hahahaha'
    server.run(port=8989,debug=True)#启动服务;加上debug=True修改代码之后会自动重启
     
    定义1个可以传参的接口(登录接口):
    import flask
    import json
    server=flask.Flask(__name__) #启动服务,把当前这个Python文件当做一个服务
    @server.route('/login',methods=['get','post'])
    def login():
        #入参是在?后面传参/k-v类型传参:
        username=flask.request.values.get('username') #括号里的username是从客户端发过来的数据
        pwd=flask.request.values.get('password')
        #入参json类型传参:
        json_data=flask.request.json   #获取所有数据
        json_data = flask.request.json.get('username') #获取某个key/value
        #入参有cookie:
        cookie=flask.request.cookies.get('xxx')  #获取cookie
        #入参有headers:
        headers=flask.request.headers.get('xxxx')  #获取headers
        if username == 'nhy' and pwd == '123456':
            res = {'code': 1000, 'msg': '登录成功', 'sign': 'sdfsdf23vsrqsdf'}
        else:
            res = {'code': 2000, 'msg': '账号/密码错误'}
        return json.dumps(res, ensure_ascii=False)
    server.run(port=8989,debug=True)#启动服务;加上debug=True修改代码之后会自动重启
     
    定义1个注册的接口,并把数据存到mysql里面:
    import flask,pymysql
    import hashlib
    import json
    server=flask.Flask(__name__) #启动服务,把当前这个Python文件当做一个服务
     
    def my_db(sql,port=3306,charset='utf8'):
    ip, user, passwd, db = 'xxx.24.3.40','jxz','123456','jxz'
    coon = pymysql.connect(host=ip,user=user,
    password=passwd,db=db,
    port=port,charset=charset,autocommit=True)
    cur = coon.cursor()
    sql=sql.strip()
    cur.execute(sql)
    sql_start = sql[:6].lower()#取sql的开头,转成小写
    if sql_start.startswith('select') or sql_start.startswith('show'):
    data = cur.fetchall()
    else:
    data = 'ok'
    cur.close()
    coon.close()
    return data
     
    def my_md5(s):
    m = hashlib.md5(s.encode())
    return m.hexdigest()
     
    @server.route('/register',methods=['post'])
    def reg():
    username = flask.request.values.get("username")
    passwd = flask.request.values.get("passwd")
    cpasswd = flask.request.values.get("cpasswd")
    if username and passwd and cpasswd:
    sql1 = 'select * from nhy where name="%s";'%username
    sql_res = my_db(sql1)
    if sql_res:
    res = {'code':2001,'msg':'该用户已经被注册'}
    else:
    if passwd==cpasswd:#
    md5_pwd = my_md5(passwd)
    sql2 = 'insert into nhy (name,pwd) value ("%s","%s");'%(username,md5_pwd)
    my_db(sql2)
    res = {'code':1000,'msg':'注册成功'}
    else:
    res = {'code':2003,'msg':'两次输入的密码不一致'}
    else:
    res = {'code':2002,'msg':'必填参数未填,请查看接口文档!'}
    return json.dumps(res,ensure_ascii=False)
    server.run(port=8989,debug=True) #启动服务
     
    程序分目录
    1.新建主目录:my_api
    2.新建二级目录:bin(运行程序的入口),conf(存放配置文件),lib(存放程序的主逻辑),logs(写日志)
    3.新建二级普通文本文件:readme.txt(程序的说明)
    4.在conf下新建setting.py,文件如下:
    MYSQL_INFO = {
    'host':'xxx.24.3.40',
    'user':'jxz',
    'password':'123456',
    'port':3306,
    'db':'jxz',
    'charset':'utf8',
    'autocommit':True
    }#数据库配置信息
     
    REDIS_INFO ={ }
     
    SERVER_PORT = 8989
    5.在lib下新建tools.py,文件如下:
    import pymysql,hashlib
    from conf.setting import MYSQL_INFO
    def my_db(sql):
    coon = pymysql.connect(**MYSQL_INFO)
    #这里用2个星号,就会把字典里面的k和v变成 k=v,只适用于字典
    cur = coon.cursor(cursor=pymysql.cursors.DictCursor)
    sql=sql.strip()
    cur.execute(sql)
    sql_start = sql[:6].lower()#取sql的开头,转成小写
    if sql_start.startswith('select') or sql_start.startswith('show'):
    data = cur.fetchall()
    else:
    data = 'ok'
    cur.close()
    coon.close()
    return data
     
    def my_md5(s):
    m = hashlib.md5(s.encode())
    return m.hexdigest()
     
    def op_redis():
    pass
    #在pacharm中加环境变量的方法:选择要加入环境变量的目录,右键——Mark Directory as——Sources Root;
    6.在lib下新建interface.py(写接口),文件如下:
    import flask,json
    from lib.tools import my_db,my_md5
     
    server = flask.Flask(__name__)
     
    @server.route('/login',methods=['get','post'])
    def taotao():
    username = flask.request.values.get('username')
    pwd = flask.request.values.get('password')
    if username=='nhy' and pwd=='123456':
    res  = {'code':1000,'msg':'登录成功','sign':'sdfsdf23vsrqsdf'}
    else:
    res = {'code':2000,'msg':'账号/密码错误'}
    return json.dumps(res,ensure_ascii=False)
     
    @server.route('/register',methods=['post'])
    def reg():
    username = flask.request.values.get("username")
    passwd = flask.request.values.get("passwd")
    cpasswd = flask.request.values.get("cpasswd")
    if username and passwd and cpasswd:
    sql1 = 'select * from nhy where name="%s";'%username
    sql_res = my_db(sql1)
    if sql_res:
    res = {'code':2001,'msg':'该用户已经被注册'}
    else:
    if passwd==cpasswd:#
    md5_pwd = my_md5(passwd)
    sql2 = 'insert into nhy (name,pwd) value ("%s","%s");'%(username,md5_pwd)
    my_db(sql2)
    res = {'code':1000,'msg':'注册成功'}
    else:
    res = {'code':2003,'msg':'两次输入的密码不一致'}
    else:
    res = {'code':2002,'msg':'必填参数未填,请查看接口文档!'}
    return json.dumps(res,ensure_ascii=False)
    7.在bin下新建start.py(运行程序入口),文件如下:
    写法1:
    from lib.interface import server
    from conf.setting import SERVER_PORT
    server.run(port=SERVER_PORT,debug=True)#不写host,只能在本地访问
    #host写成0.0.0.0就可以同一个局域网里面所有人都能访问了,如:server.run(host='0.0.0.0',port=SERVER_PORT,debug=True)
     
    写法2:(不在pacharm中运行,把这些文件拿到别处运行,运行前需手动加环境变量)
    import sys
    sys.path.insert(0,r'E:spzday7my_api')
    from lib.interface import server
    from conf.setting import SERVER_PORT
    server.run(port=SERVER_PORT,debug=True)
    #一定要先加环境变量,再导入
     
    写法3(动态加环境变量的方法):
    import sys,os
    base_path = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
    sys.path.insert(0,base_path)
    from lib.interface import server
    from conf.setting import SERVER_PORT
    server.run(port=SERVER_PORT,debug=True)
    #print(__file__)#不管什么时候,__file__都是当前这个python文件的绝对路径
    #这里加入环境变量的,通过__file__获取到父目录的父目录
    #用abs_paht是因为分隔符不正确
     
    读excel
    import xlrd   #只能读
    book = xlrd.open_workbook('nhy.xls')    #打开excel
    # print(book.nsheets)    #获取到excel里面总共有多少个sheet页
    sheet = book.sheet_by_index(0)     #获取sheet页:根据索引
    #book.sheet_by_name('sheet1')     #获取sheet页:根据名字
    print(sheet.cell(0,0).value)    #指定行和列,获取某个单元格里面的内容
    print(sheet.cell(1,0).value)
    print(sheet.row_values(0))   #获取某一行的数据,0代表获取第1行的数据
    print(sheet.row_values(1))   #获取某一行的数据,1代表获取第2行的数据
    print(sheet.nrows)      #获取这个excel里面总共有多少行
    print(sheet.col_values(0))   #获取某一列的数据,0代表获取第1列的数据
    print(sheet.col_values(1))   #某一列的数据,1代表获取第2列的数据
    print(sheet.ncols)    #获取这个excel总共有多少列
     
    修改excel
    1.修改excel要先复制一个excel,再修改
    import xlrd
    from xlutils import copy
    book1 = xlrd.open_workbook('nhy.xls')   #打开原来的excel
    new_book = copy.copy(book1)     #拷贝一个新的excel
    sheet = new_book.get_sheet(0)    #获取第一个sheet页
    sheet.write(1,3,'18')
    sheet.write(1,1,'王艳会')
    new_book.save('nhy.xls')   #保存excel
  • 相关阅读:
    VRRP(Virtual Router Redundancy Protocol)业界标准
    CISCO快速转发
    89、C++中将临时变量作为返回值时的处理过程
    87、C++函数调用的压栈过程
    82、类什么时候会析构?
    84、智能指针的原理、常用的智能指针及实现
    81、构造函数一般不定义为虚函数的原因
    80、构造函数析构函数可否抛出异常
    79、虚析构函数的作用,父类的析构函数是否要设置为虚函数?
    78、构造函数、析构函数的执行顺序?
  • 原文地址:https://www.cnblogs.com/you-shu/p/9357106.html
Copyright © 2020-2023  润新知