【Python】批量导出数据并处理——第一弹
惯例还是先交代下背景:最近因为工作需要,同事需要一批数据,每次7天7个人所以就是49个文件,虽然数据条数不多,但是处理起来比较麻烦,首先需要设置七个人不同的角色权限——通过接口发送请求,得到存在服务器中的49个文件——下载文件到本地——因为文件是已压缩包形式存在的,所以下载下来后还需要解压、分类、打包后再次发送,预想将上述的步骤全通过代码来实现主要可以分以下几部分:
- 通过数据库设置七个人的角色权限
- 再通过接口发送请求(1、2是本文所实现的功能)
- 下载文件到本地
- 文件批量解压
- 根据解压后的文件中的内容重命名文件
- 将重命名后的文件分类放到不同的文件夹中
- 再将不同的文件夹打包(4~7完成了一部分,但有些问题一直没解决,头疼中。。。。)
- 通过微信将压缩包发给需要的人(待定,或者是使用邮件发送?)
现在设想的就分这么多步骤,需要使用到的库涵盖了数据库操作、发送请求、下载文件(连接服务器)、文件的解压缩、文件的读取、重命名以及发送微信文件或邮件,可以说相当全面了,全部完成后肯定会对自己的水平提升有很大帮助。好了,背景交代完毕,上代码!(PS. 其实批量发送接口请求这部分功能之前已经通过Jmeter或SoapUI实现了,此次算是通过第三种方法实现一下吧!)
1、首先来看下实现该部分功能的文件结构吧!
2、数据库操作相关,用到的库是pymysql,代码如下:
# -*- coding:UTF-8 -*-
import pymysql
class Sql():
def __init__(self,host,port,database,user,password):
try:
self.db = pymysql.connect(host=host,port=port,user=user,password=password,database=database)
print('=======Connect Success!=======\n')
except pymysql.Error as e:
print('Connect Error: %s' %e)
def update(self,sql):
cursor = self.db.cursor()
try:
self.db.ping(reconnect=True) # 解决pymysql.err.InterfaceError报错
cursor.execute(sql)
self.db.commit()
print('Update Success!\n')
except:
self.db.rollback()
self.db.close()
3、这部分实现的功能是首先初始化七个用户的角色权限,然后发送请求,用到的库有requests、json、configparser
# -*- coding:UTF-8 -*-
import requests
import json
import configparser
from database import Sql
# import os
def send():
conf = configparser.ConfigParser()
conf.read('.\config.ini')
# 遍历配置文件中的data部分
user_conf = conf.get('data', 'export_user').split(',')
data_conf = conf.get('data', 'downloadDate').split(',')
url = 'http://xxx.xxx.xxx.xx:xxxx/xxxx/xxxx'
headers = {'content-type': 'application/json'}
# 遍历config.ini中的user和date,逐条发送post请求,请求体使用json格式
for name in user_conf:
for date in data_conf:
data = {"userId": name, "downloadDates": date}
req = requests.post(url,data=json.dumps(data),headers=headers)
print('已发送>>> %s %s 的数据' % (data['userId'], data['downloadDates']))
if __name__ == '__main__':
# 选择使用的数据库
db_choice = 'db_test'
conf = configparser.ConfigParser()
conf.read('.\config.ini')
host = conf.get(db_choice,'host')
port = int(conf.get(db_choice,'port'))
database = conf.get(db_choice,'database')
user = conf.get(db_choice,'user')
password = conf.get(db_choice,'password')
My_sql = Sql(host,port,database,user,password)
real_sql = [
'''UPDATE `A`.`user` SET `type` = 'xxx', `type_id` = 103 WHERE `user_id` = 'a';''',
'''UPDATE `A`.`user` SET `type` = 'xxx', `type_id` = 108 WHERE `user_id` = 'b';''',
'''UPDATE `A`.`user` SET `type` = 'xxx', `type_id` = 111 WHERE `user_id` = 'c';''',
'''UPDATE `A`.`user` SET `type` = 'xxx', `type_id` = 118 WHERE `user_id` = 'd';''',
'''UPDATE `A`.`user` SET `type` = 'xxx', `type_id` = 104 WHERE `user_id` = 'e';''',
'''UPDATE `A`.`user` SET `type` = 'xxx', `type_id` = 100 WHERE `user_id` = 'f';''',
'''UPDATE `A`.`user` SET `type` = 'xxx', `type_id` = 112 WHERE `user_id` = 'g';'''
]
for s in real_sql:
my_update = My_sql.update(s)
send()
4、配置文件,文件中的各部分数据进行了隐藏,分测试环境和正式环境,export_user代表七个用户
[db_Online]
host = xxx.xxx.xxx.xx
port = 3306
database = mydatabase
user = myuser
password = mypassword
[db_test]
host = xxx.xxx.xxx.xx
port = 3306
database = mydatabase
user = myuser
password = mypassword
[data]
export_user = a,b,c,d,e,f,g
downloadDate = 2018.08.01,2018.08.02,2018.08.03,2018.08.04,2018.08.05,2018.08.06,2018.08.07
5、正在找怎么通过Jenkins执行这些代码(Jenkins+Jmeter+Ant也完全可以实现),这样项目组里的人就谁都可以完成这项工作了(我才不是因为想要偷懒呢!),待续吧。。。。
写在最后,本人新手菜鸟,代码的严谨性、可读性与简洁性。。。。。好吧,根本就没有这些东西,哈哈哈~~欢迎各位大佬给提意见!
转载自:https://blog.csdn.net/xjian32123/article/details/82665257