Python3(15):python之实际应用--python数据处理,读取Excel数据并进行对比

python之实际应用--python数据处理,读取Excel数据并进行对比

前言

产品的媒体库(开发代码)更新逻辑:

跟第三方接口对接,每日需要发送新的媒体给第三方接口至少200条,并且需要更新媒体的数据信息,逻辑如下:

  1. 每天删除第三方的媒体库中的200条媒体
  2. 需要从公司产品的媒体库读取至少新的200条数据发送到第三方媒体库(如昨日媒体库缺少,则需要补足)
  3. 保证每次发送成功并入第三方的媒体库的是至少200条。
  4. 更新2000条媒体数据信息 

例如:昨日第三方媒体库不足2000条,那么补足,那么当日发送的媒体数是[200+(2000-昨日媒体库媒体数量)]

例子:昨日第三方媒体库1900条,那么今日应更新: 200+(2000-1900)=300条

测试这边需要做的测试工作:

  1. 需要检查每日发送成功并入第三方媒体库的媒体数据是否为[200+(2000-昨日媒体库媒体数量)]?数量是否对
  2. 发送成功但未入第三方媒体库的是哪些媒体?具体媒体信息
  3. 发送失败的是哪些媒体?具体媒体信息
  4. 发送的媒体数据是否有重复的媒体数据?具体媒体信息
  5. 第三方媒体库是否有重复的媒体数据?具体媒体信息

媒体类型: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、思路和解决方案

思路

1使用xlrd方法读取xlsx的文件,然后存入list变量参数中

2执行时调用list变量参数

解决方案:

  1. 引用xlrd,获取xlsx的sheet,一列一列的读取,放入列表list中

For语句循环行读取每一列的值

方法:self.getRows()

      self.getSheet().cell_value(i, 0)

2、引用

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"]]

你可能感兴趣的:(python相关,python,excel,开发语言)