操作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