python之实际应用--python数据处理,读取Excel数据并进行对比
前言:
产品的媒体库(开发代码)更新逻辑:
跟第三方接口对接,每日需要发送新的媒体给第三方接口至少200条,并且需要更新媒体的数据信息,逻辑如下:
- 每天删除第三方的媒体库中的200条媒体
- 需要从公司产品的媒体库读取至少新的200条数据发送到第三方媒体库(如昨日媒体库缺少,则需要补足)
- 保证每次发送成功并入第三方的媒体库的是至少200条。
- 更新2000条媒体数据信息
例如:昨日第三方媒体库不足2000条,那么补足,那么当日发送的媒体数是[200+(2000-昨日媒体库媒体数量)]
例子:昨日第三方媒体库1900条,那么今日应更新: 200+(2000-1900)=300条
测试这边需要做的测试工作:
- 需要检查每日发送成功并入第三方媒体库的媒体数据是否为[200+(2000-昨日媒体库媒体数量)]?数量是否对
- 发送成功但未入第三方媒体库的是哪些媒体?具体媒体信息
- 发送失败的是哪些媒体?具体媒体信息
- 发送的媒体数据是否有重复的媒体数据?具体媒体信息
- 第三方媒体库是否有重复的媒体数据?具体媒体信息
媒体类型:1: 微博 , 2: 微信 , 3:今日头条
微信媒体ID为唯一值
微博/今日头条:媒体名称为唯一值
代码部分:
序号 | 目录 | 文件 |
1 |
| 公共方法:common.py |
日志服务:log.py | ||
读取数据:read_excel.py | ||
2 | Data目录:数据文件 | 数据文件:sent_today.xlsx today_zhiwenku.xlsx yesterday_zhiwenku.xlsx |
3 | logs目录:执行的日志目录 | "执行时才会生成日志目录" |
4 | repoort目录:执行的report目录 | "执行时才会生成report目录" |
一读取数据py
思路:
1使用xlrd方法读取xlsx的文件,然后存入list变量参数中
2执行时调用list变量参数
解决方案:
- 引用xlrd,获取xlsx的sheet,一列一列的读取,放入列表list中
For语句循环行读取每一列的值
方法:self.getRows()
self.getSheet().cell_value(i, 0)
- 引用
import read_Excel
re=read_Excel.readData(r"data/sent_today.xlsx")
#对象调用读取(发送数据)媒体名称列的方法
list1=re.getmediaName()
3.read_excel.py代码
#!/usr/bin/env python # -*- coding: utf-8 -*- # author:Meifen # 基础包:excel读取数据的封装 import xlrd class readData(): def __init__(self, path): self.path = path def getSheet(self): # 获取sheet索引(0代表第1个sheet) data = xlrd.open_workbook(self.path) sheet = data.sheet_by_index(0) # sheet=data.sheets()[0] return sheet
def getRows(self): # 获取行数 row = self.getSheet().nrows return row
def getCols(self): # 获取列数 col = self.getSheet().ncols return col
# 以下是获取列号索引是3的数值 def getmediaName(self): MediaName = [] try: for i in range(0, self.getRows()): media_name=self.getSheet().cell_value(i, 3) if media_name !="media_name": #如果获取的数据不是第一行标题栏,添加入库 #MediaName.append(self.getSheet().cell_value(i, 3)) MediaName.append(media_name) except IOError as e: print ("读取数据出现异常%s,请选择正确文件"%e) return MediaName
# 以下是获取列号索引是2的数值 def getmediaName_zhiwen(self): MediaName = [] try: for i in range(0, self.getRows()): name=self.getSheet().cell_value(i, 2) if name !="name": #如果获取的数据不是第一行标题栏,添加入库 #MediaName.append(self.getSheet().cell_value(i, 2)) MediaName.append(name) except IOError as e: print ("读取数据出现异常%s,请选择正确文件"%e) return MediaName |
二日志py
思路:使用代码生成日志文件
解决方案:
1使用Python代码显式的创建loggers, handlers和formatters并分别调用它们的配置函数
# logging对象,设置从那个等级开始提示
logger = logging.getLogger()
#创建handler
time_handler=logging.handlers.TimedRotatingFileHandler(logfile,'D')
#handler设置日志格式
fmt=logging.Formatter("%(asctime)s - %(name)s -%(module)s- %(levelname)s - %(message)s","%Y-%m-%d %H:%M:%S")
time_handler.setFormatter(fmt)
#添加刚设置的handler
logger.addHandler(time_handler)
2生成日志文件,文件:logs\当前日期\log+时间.log
#日志文件
logfile = os.path.join(log_path,"log%s.log") %time
3、调用
3.1、run_test.py调用
#创建日志目录
com = common.commonUtils()
logtime = time.strftime("%H%M%S")
log_path=com.getPath("logs") #生成的日志目录在当前Folder下
#生成日志文件
log.logfile(log_path,logtime)
3.2、其他需要日志的调用
import logging
logging.info("请求返回值的json串值:%s"%apijson)
三. 公共方法
#!/usr/bin/env python # -*- coding: utf-8 -*- ''' Created on 2019-11-14
@author: Meifen '''
import time import os
class common(): #对比数据 def getDifferentInfo(self, list1, list2): #ab(bc) list3 = list(set(list1).intersection(set(list2))) #ab(bc)=b list4 = list(set(list1).difference(set(list3))) #ab(b)=a return list4
#list1跟list2比对,找出list1跟list2中数据的不同值 def getDifferentInfo2(self, list1, list2): #list1=["b2","a1","c3","d1"],list2=["a2","b2","c0","d0"] list3 = list(set(list1).difference(set(list2))) #['a1', 'c3', 'd1'] return list3
#list1跟list2比对,找出list1跟list2相同的值 def getIntersectInfo(self, list1, list2): #list1=["a1","b2","c3","d1"],list2=["a2","b2","c0","d0"] list4 = list(set(list1).intersection(set(list2))) #["b2"] return list4
#获取日期 def getNowDate(self): return time.strftime("%Y%m%d", time.localtime(time.time())) #获取时间 def getNowTime(self): return time.strftime("%Y%m%d%H%M%S", time.localtime(time.time()))
#列表list中找出两列存在重复的媒体数据(类型列typecol,媒体名称列mediacol) def getRepeat(seff,alist,typecol,mediacol): rlist=[] alllist=[] nums=len(alist) for i in range(0,nums): j = i+1 for j in range(j,nums): #对比发送列表的类型列:第1列和媒体名称列:第3列,对比第三方库表的类型列:第1列和媒体名称列:第2列 if ((alist[i][typecol] == alist[j][typecol]) and (alist[i][mediacol] == alist[j][mediacol])): rlist.append(int(alist[i][typecol])) #浮点型变成整型 rlist.append(alist[i][mediacol]) alllist.append(rlist) return alllist
#创建目录 def getFilePath(self,path): isExists = os.path.exists(path) if not isExists: os.mkdir(path) return path |
- 四. 对比的py
#!/usr/bin/env python # -*- coding: utf-8 -*- ''' Created on 2019-11-19
@author: Meifen ''' import read_Excel import common import os,time import log import logging
com=common.common() #对象 nowDate=com.getNowDate() ctime=com.getNowTime()
#创建日志目录 def log_track(): try: logtime = time.strftime("%H%M%S") #log_path=r"logs/" log_path=com.getFilePath("logs") #生成日志文件 log.logfile(log_path,logtime) except Exception as e: print("生成日志文件error:",e) logging.error("生成日志文件error:",e)
#创建报告report.txt #reportname = r"report/report" + ctime + ".txt" reportpath=com.getFilePath("report") reportname = reportpath + r'\report' + ctime + '.txt'
def compare(): log_track() try: print ("开始执行第三方数据对比小程序,请等待...") logging.info("开始执行第三方数据对比小程序,请等待...") print ("-------------------------------------------") logging.info("-------------------------------------------") f = open(reportname, 'a') #昨日第三方媒体数量 re0=read_Excel.readData(r"data/yesterday_zhiwenku.xlsx") list0=re0.getmediaName_zhiwen() sums_yes=len(list0)
send_nums=200+(2000-sums_yes) #print ("%s第三方媒体数据比对:"%nowDate) #print ("昨日第三方库媒体数据:%s条,今日应成功发送并入第三方库媒体:%s条\n"%(sums_yes,send_nums)) logging.info("%s第三方媒体数据比对:"%nowDate) logging.info("昨日第三方库媒体数据:%s条,今日应成功发送并入第三方库媒体:%s条\n"%(sums_yes,send_nums))
f.write("%s第三方媒体数据比对:"%nowDate) f.write("\n") #换行 f.write("昨日第三方库媒体数据:%s条,今日应成功发送并入第三方库媒体:%s条\n"%(sums_yes,send_nums)) f.write("\n") #换行 f.close()
#----------------------------------------------------------------- #获取读取Excel数据的类readData对象(发送数据) re=read_Excel.readData(r"data/sent_today.xlsx") #对象调用读取(发送数据)媒体名称列的方法 list1=re.getmediaName()
#获取读取Excel数据的类readData对象(当天第三方库) re2=read_Excel.readData(r"data/today_zhiwenku.xlsx") #对象调用读取(当天第三方库)媒体名称列的方法 list2=re2.getmediaName_zhiwen()
#----------------------------------------------------------------- #发送列表跟第三方媒体库对比,不同的(发送的数据未存在于第三方媒体库) f = open(reportname, 'a')
list3=com.getDifferentInfo2(list1,list2) #print ("%s发送的媒体数据总条数:%s"%(nowDate,len(list1))) logging.info("%s发送的媒体数据总条数:%s"%(nowDate,len(list1))) f.write("%s发送的媒体数据总条数:%s"%(nowDate,len(list1))) f.write("\n") #换行
if list3 == []: #print ("发送的媒体数据,发送成功并存在第三方库的数据条数:%s"%(len(list1)-len(list3))) logging.info("发送的媒体数据,发送成功并存在第三方库的数据条数:%s"%(len(list1)-len(list3))) f.write("发送的媒体数据,发送成功并存在第三方库的数据条数:%s"%(len(list1)-len(list3))) f.write("\n") #换行 else: #print ("发送的媒体数据,发送成功并存在第三方库的数据条数:%s,未存在第三方媒体库的是:%s"%(len(list1)-len(list3),list3)) logging.info("发送的媒体数据,发送成功并存在第三方库的数据条数:%s,未存在第三方媒体库的是:%s"%(len(list1)-len(list3),list3)) f.write("发送的媒体数据,发送成功并存在第三方库的数据条数:%s,未存在第三方媒体库的是:%s"%(len(list1)-len(list3),list3)) f.write("\n") #换行
f.close() #------------------------------------------------------------------ #发送的列表中存在重复的媒体数据 f = open(reportname, 'a')
list_1=re.getRowsValue() #从excel获取数据 alllist_send=com.getRepeat(list_1,1,3) #对比数据,找出重复的媒体数据(类型列:第1列和媒体名称列:第3列)
if alllist_send ==[]: #print ("%s发送的列表中未存在重复的媒体数据"%nowDate) logging.info("%s发送的列表中未存在重复的媒体数据"%nowDate) f.write("%s发送的列表中未存在重复的媒体数据"%nowDate) f.write("\n") #换行 else: #print ("%s发送的列表中存在重复的媒体数据,媒体名称:%s"%(nowDate,alllist_send)) logging.info("%s发送的列表中存在重复的媒体数据,媒体名称:%s"%(nowDate,alllist_send)) f.write("%s发送的列表中存在重复的媒体数据,媒体名称:%s"%(nowDate,alllist_send)) f.write("\n") #换行 f.write("\n") #换行
f.close()
#----------------------------------------------------------------- #第三方库里两列存在重复的媒体数据 f = open(reportname, 'a')
list_4=re2.getRowsValue() #从excel获取数据 alllist_zhiwen=com.getRepeat(list_4,1,2) #对比数据,找出重复的媒体数据(类型列:第1列和媒体名称列:第2列) if alllist_zhiwen==[]: #print ("%s第三方库里未存在重复的媒体数据"%nowDate) logging.info("%s第三方库里未存在重复的媒体数据"%nowDate) f.write("%s第三方库里未存在重复的媒体数据"%nowDate) f.write("\n") #换行 else: print ("%s第三方库里存在重复的媒体数据,媒体名称:%s"%(nowDate,alllist_zhiwen)) logging.info("%s第三方库里存在重复的媒体数据,媒体名称:%s"%(nowDate,alllist_zhiwen)) f.write("%s第三方库里存在重复的媒体数据,媒体名称:%s"%(nowDate,alllist_zhiwen)) f.write("\n") #换行
f.close()
#print ("-------------------------------------------") logging.info("-------------------------------------------") print ("执行第三方数据对比小程序结束,请查看report") logging.info("执行第三方数据对比小程序结束,请查看report") except IOError as e: f = open(reportname, 'a') f.write("compare出现异常%s" %e) f.close() #print ("出现异常%s" %e) logging.error("compare出现异常%s" %e)
if __name__ == '__main__': compare() |
五.其他学习参考文档
目前需要做织闻发送数据对比测试,所以用到以下的函数,请参考。
5.1数据表对比两个表的数据
5.1.1对比两个表中不同的部分
#找出两个表中不同的部分
list3 = list(set(list1).difference(set(list2))) |
5.1.2对比两个表中相同的部分
#找出两个表中相同的部分
list4 = list(set(list1).intersection(set(list2))) |
5.2.数据表中本列表找出单列重复的数据:
5.2.1、#找出本列表,单列重复的数据(方法1)
#找出本列表,单列重复的数据(方法1)
from collections import Counter b=dict(Counter(list2)) b1=[key for key,value in b.items()if value > 1] print (b1) |
5.3数据表中本列表中找出两列重复的数据:
5.3.1、#找出本列表中,两列重复的数据
#找出本列表,两列重复的数据 list_4=[[1,"万xx"],[1,"万保川"],[2,"万xx"],[3,"万保川"],[1,"胡xx"]] print (len(list_4))
clist=[] alllist=[] nums=len(list_4) for i in range(0,nums): #print (list_4[i][0],list_4[i][1]) j = i+1 for j in range(j,nums): #print (list_4[j][0],list_4[j][1]) if ((list_4[i][0] == list_4[j][0]) and (list_4[i][1] == list_4[j][1])): #print (list_4[i][0],list_4[i][1]) clist.append(list_4[i][0]) clist.append(list_4[i][1]) alllist.append(clist) print (alllist) #[[1,"万xx"]] |