excel sheet限制_Python 处理Excel内的数据(案例介绍*3)

623559c5-ee2f-eb11-8da9-e4434bdf6706.png点击上方“蓝字”关注我们了解更多精彩633559c5-ee2f-eb11-8da9-e4434bdf6706.png案例一介绍

现在有一批电商产品跟当日销量的数据,如下,总共有上万笔的数据,现在需要统计每个品牌当日的销售量,比如美宝莲今天总共卖出了多少的商品,另外需要统计每个品牌下面的每个子品类当日销售量(品类可分为口红、睫毛膏、粉底等),比如卡姿兰口红卖了多少、眉笔卖了多少。

643559c5-ee2f-eb11-8da9-e4434bdf6706.png
首先是要做出关键字码表,如下,这些是透过电商常用的产品称呼和观察发现的,需要对商品名称有一定的了解,比如欧莱雅的洁面膏其实就是洗面奶

653559c5-ee2f-eb11-8da9-e4434bdf6706.png


后面就是建立一个list,里面包含这些子品类,用这些关键字和品牌名称在商品列表逐一做匹配,比如商品里有“卡姿兰”又有“口红”的,再将符合的商品销售数量累加,输出至excel里,就可以完成统计,代码如下
import xlrdimport xlwtreadbook = xlrd.open_workbook(r'brand.xlsx')sheet = readbook.sheet_by_index(0)cols1=sheet.col_values(0)cols2=sheet.col_values(1)workbook = xlwt.Workbook(encoding='utf-8')worksheet = workbook.add_sheet('result')#建立子品类清单items = ['眉笔','口红','眉粉','眼线笔','睫毛膏','粉饼','唇彩','散粉','眼影','唇釉','腮红','BB霜','粉底液','卸妆水','隔离霜','面霜','香水']k = -1b = 0 #b是记录总数for item in items:    a = 0 #a是某个子品类的数目    array = []    i = -1    k = k+1    for col in cols1:        i = i + 1     if  (item in col) and ('卡姿兰' in col): #商品名称里包含list里面的子品类和卡姿兰            array.append(i)    for n in array:        a = a+ cols2[n]    print(item)    print(a)    b = b+a    worksheet.write(k,0,item)    worksheet.write(k,1,a)worksheet.write(k+1,0,'总数')worksheet.write(k+1,1,b)workbook.save('result.xls')
最后将输出的结果做图展示

683559c5-ee2f-eb11-8da9-e4434bdf6706.png

6a3559c5-ee2f-eb11-8da9-e4434bdf6706.png案例二介绍  

在一个项目中我们需要对用户的终端机器进行统计,可是接口传回的数据如下图,同样是IPhone却有上万种写法,除了IPhone外,其他的安卓手机像是华为、OPPO、VIVO、小米等都有类似的情况,现在需要将这些分散的数据识别出,并加以统计

6b3559c5-ee2f-eb11-8da9-e4434bdf6706.png

流程为:

    1、用关键字对表内的内容进行查找,将包含关键字的行记录。

    2、将包含关键字行第二列的数据进行加成,并且统计 

    3、输出到新的文档里


首先我们需要先制作一个关键字码表,如下图,我们将4大安卓机外的安卓机合计到安卓里面

6d3559c5-ee2f-eb11-8da9-e4434bdf6706.png

接着,用xlrd读取excel,用码表内的关键字跟第一列的数据进行匹配,符合匹配的将第二列的数字加总,最后用xlwt输出到excel文件里,实现代码如下:

import xlrdimport xlwtreadbook = xlrd.open_workbook(r'phone.xlsx')sheet = readbook.sheet_by_index(0)cols1=sheet.col_values(0)cols2=sheet.col_values(1)i = -1a = 0 #记录数目array = []keywords = ['iphone', 'iPhone', '苹果', 'Iphone', 'iOS']for col in cols1:    i = i + 1    for word in keywords: #匹配清单内的关键字        if  word in col:            array.append(i)for n in array:    a = a+ cols2[n]print(a)workbook = xlwt.Workbook(encoding='utf-8')worksheet = workbook.add_sheet('test')worksheet.write(1,1,a)workbook.save('phone1.xls')

最后用EXCEL作图,就可以完成用户数据统计

6e3559c5-ee2f-eb11-8da9-e4434bdf6706.png

6f3559c5-ee2f-eb11-8da9-e4434bdf6706.png713559c5-ee2f-eb11-8da9-e4434bdf6706.png6f3559c5-ee2f-eb11-8da9-e4434bdf6706.png743559c5-ee2f-eb11-8da9-e4434bdf6706.png案例三介绍763559c5-ee2f-eb11-8da9-e4434bdf6706.png

封装一个读取用例的excel类:用来实现读取数据和写入数据的功能

cases.xlsx的测试数据:

773559c5-ee2f-eb11-8da9-e4434bdf6706.png

1.按行读取数据,存储在列表中

import openpyxlclass Case: #这个类用来存储用例的    __slots__ = [] #特殊的类属性,可以用来限制这个类创建的实例属性添加 可写可不写    passclass ReadExcel(object): #读取excel数据的类    def __init__(self,file_name,sheet_name):        """        这个是用来初始化读取对象的        :param file_name: 文件名 ---> str类型        :param sheet_name: 表单名 ———> str类型        """        # 打开文件        self.wb = openpyxl.load_workbook(file_name)        # 选择表单        self.sh = self.wb[sheet_name]    def read_data_line(self):        #按行读取数据转化为列表        rows_data = list(self.sh.rows)        # print(rows_data)        # 获取表单的表头信息        titles = []        for title in rows_data[0]:            titles.append(title.value)        # print(titles)        #定义一个空列表用来存储测试用例        cases = []        for case in rows_data[1:]:            # print(case)            data = []            for cell in case: #获取一条测试用例数据                # print(cell.value)                data.append(cell.value)                # print(data)                #判断该单元格是否为字符串,如果是字符串类型则需要使用eval();如果不是字符串类型则不需要使用eval()                if isinstance(cell.value,str):                    data.append(eval(cell.value))                else:                    data.append(cell.value)                #将该条数据存放至cases中            # print(dict(list(zip(titles,data))))                case_data = dict(list(zip(titles,data)))                cases.append(case_data)        return casesif __name__ == '__main__':    r = ReadExcel('cases.xlsx','Sheet1')    data1 = r.read_data_line()    print(data1)

2.按行读取数据,存储在对象中

import openpyxlclass Case:    passclass ReadExcel(object):    def __init__(self,filename,sheetname):        self.wb = openpyxl.load_workbook(filename)        self.sh = self.wb[sheetname]    def read_data_obj(self):        """        按行读取数据  每条用例存储在一个对象中        :return:        """        rows_data = list(self.sh.rows)        # print(rows_data)        # 获取表单的表头信息        titles = []        for title in rows_data[0]:            titles.append(title.value)        # print(titles)        # 定义一个空列表用来存储测试用例        cases = []        for case in rows_data[1:]:            # print(case)            #创建一个Case类的对象,用来保存用例数据            case_obj = Case()            data = []            for cell in case:  # 获取一条测试用例数据                # print(cell.value)                # data.append(cell.value)                # print(data)                if isinstance(cell.value,str):  # 判断该单元格是否为字符串,如果是字符串类型则需要使用eval();如果不是字符串类型则不需要使用eval()                    data.append(eval(cell.value))                else:                    data.append(cell.value)            # 将该条数据存放至cases中            # print(dict(list(zip(titles,data))))            case_data = list(zip(titles, data))            # print(case_data)            for i in case_data:                setattr(case_obj,i[0],i[1])            # print(case_obj)            # print(case_obj.case_id,case_obj.data,case_obj.excepted)            cases.append(case_obj)        return casesif  __name__ == '__main__':    r = ReadExcel('cases.xlsx','Sheet1')    res = r.read_data_obj()    for i in res:        print(i.caseid, i.excepted, i.data)

 3.将测试用例封装到列表中,读取指定列的数据

import openpyxlclass Case:    passclass ReadExcelZy(object):    def __init__(self,filename,sheetname):        self.wb = openpyxl.load_workbook(filename)        self.sheet = self.wb[sheetname]        # list1 参数为一个列表,传入的是指定读取数据的列,比如[1,2,3]        # 每一行[1,3,5]列的数据,读取出来就作为一条测试用例,放在字典中        # 所有的用例放在列表中并且进行返回    def read_data(self,list1):        """        :param list1:  list--->要读取列   list类型        :return:    返回一个列表,每一个元素为一个用例(用例为dict类型)        """        # 获取最大的行数        max_r = self.sheet.max_row        cases = []   #定义一个空列表,用来存放所有的用例数据        titles = []   #定义一个空列表,用来存放表头        # 遍历所有的行数据        for row in range(1,max_r+1):            if row != 1:      #判断是否是第一行                case_data = [] #定义一个空列表,用来存放该行的用例数据                for column in list1:                    info = self.sheet.cell(row,column).value                    # print(info)                    case_data.append(info)                    # print(list(zip(titles,case_data)))                case = dict(zip(titles,case_data))  #将该条数据和表头进行打包组合,作用相当于dict(list(zip(titles,case_data)))                # print(case)                cases.append(case)                # print(cases)            else:   #获取表头数据                for column in list1:                    title = self.sheet.cell(row,column).value                    titles.append(title)                # print(titles)        return casesif __name__ == '__main__':    r = ReadExcelZy("cases.xlsx","Sheet1")    res = r.read_data([1,2,3])    for o in res:        print(o['caseid'],o['data'],o['excepted'])

4.将测试用例封装到对象中,读取指定列的数据

import openpyxlclass Case:    passclass ReadExcelZy(object):    def __init__(self,filename,sheetname):        self.wb = openpyxl.load_workbook(filename)        self.sheet = self.wb[sheetname]        # list1 参数为一个列表,传入的是指定读取数据的列,比如[1,2,3]        # 每一行[1,3,5]列的数据,读取出来就作为一条测试用例,放在字典中        # 所有的用例放在对象中并且进行返回    def read_data_obj(self,list2):        max_r1 = self.sheet.max_row      #获取最大行数        cases = []        titles = []      #用来存放表头数据        for row in range(1,max_r1+1):            if row != 1:                case_data = []                for column in list2:                    info = self.sheet.cell(row,column).value                    # print(info)                    case_data.append(info)                cases_data = list(zip(titles,case_data))                #将一条用例存到一个对象中(每一列对应对象的一个属性)                case_obj = Case()                for i in cases_data:                    # print(i)                    setattr(case_obj,i[0],i[1])                # print(case_obj.caseid,case_obj.excepted,case_obj.data)                cases.append(case_obj)            else:                for column in list2:                    title = self.sheet.cell(row,column).value                    titles.append(title)        return casesif __name__ == '__main__':    r = ReadExcelZy("cases.xlsx","Sheet1")    res = r.read_data_obj([1,2,3])    for i in res:        print(i.caseid,i.data,i.excepted)

5.优化第4部分代码,将设置对象属性写在初始化方法中(封装Excel类读取数据最常用的方法)

import openpyxlclass Case:  # 这个类用来存储用例的    def __init__(self, attrs):        """        初始化用例        :param attrs:zip类型——>[{key,value},(key1,value1)......]        """        for i in attrs:            setattr(self, i[0], i[1])class ReadExcel(object):    def __init__(self, filename, sheetname):        """        定义需要打开的文件及表名        :param filename:   文件名        :param sheetname:  表名        """        self.wb = openpyxl.load_workbook(filename)        self.sheet = self.wb[sheetname]    def read_data_obj_new(self, list2):        # 获取最大行数        max_r1 = self.sheet.max_row        cases = []        # 用来存放表头数据        titles = []        for row in range(1, max_r1 + 1):            if row != 1:                case_data = []                for column in list2:                    info = self.sheet.cell(row, column).value                    # print(info)                    case_data.append(info)                case = list(zip(titles, case_data))                # 新建对象时,将对象传给Case类                case_obj = Case(case)                # print(case_obj.caseid,case_obj.excepted,case_obj.data)                cases.append(case_obj)            else:                # 获取表头                for column in list2:                    title = self.sheet.cell(row, column).value                    titles.append(title)                if None in titles:                    raise ValueError("传入的表头的数据有显示为空")        return casesif __name__ == '__main__':    r = ReadExcel('cases.xlsx', 'Sheet1')    res1 = r.read_data_obj_new([1, 2, 3])    for i in res1:        print(i.caseid, i.data, i.excepted)

完整流程的代码

一、将测试数据参数化

import unittestfrom python.register_new.register import registerfrom python.register_new.register_testcase_new import RegisterTestCasefrom HTMLTestRunnerNew import HTMLTestRunnerclass RegisterTestCase(unittest.TestCase):    # 初始化测试用例    def __init__(self,modethod_name,excepted,data):        # modethod_name 测试用例方法名        super().__init__(modethod_name)        # excepted 测试用例的预期结果        self.excepted = excepted        # data 测试用例参数值        self.data = data    def setUp(self):        print("准备测试环境,执行测试用例之前会执行此操作")    def tearDown(self):        print("还原测试环境,执行完测试用例之后会执行此操作")    def test_register(self):        res = register(*self.data)        try:            self.assertEquals(self.excepted,res)        except AssertionError as e:            print("该条测试用例执行未通通过")            raise e        else:            print("该条测试用例执行通过")# 创建测试套件suite = unittest.TestSuite()# 将测试用例添加至测试套件中case = [{'excepted':'{"code": 1, "msg": "注册成功"}','data':'('python1', '123456','123456')'},        {'excepted':'{"code": 0, "msg": "两次密码不一致"}','data':'('python1', '1234567','123456')'}]for case in cases:    suite.addTest(RegisterTestCase('test_register',case['excepted'],case['data']))# 执行测试套件,生成测试报告with open("report.html",'wb') as f:    runner = HTMLTestRunner(        stream = f,        verbosity = 2,        title = 'python_test_report',        description = '这是一份测试报告',        tester = 'WL'    )    runner.run(suite)

二.将调用封装好的Excel类的完整代码流程

import unittestfrom python.register_new.register import registerfrom python.register_new.register_testcase_new import RegisterTestCasefrom HTMLTestRunnerNew import HTMLTestRunnerfrom python.readexcel import ReadExcelclass RegisterTestCase(unittest.TestCase):    # 初始化测试用例    def __init__(self, modethod_name, excepted, data):        # modethod_name 测试用例方法名        super().__init__(modethod_name)        # excepted 测试用例的预期结果        self.excepted = excepted        # data 测试用例参数值        self.data = data    def setUp(self):        print("准备测试环境,执行测试用例之前会执行此操作")    def tearDown(self):        print("还原测试环境,执行完测试用例之后会执行此操作")    def test_register(self):        res = register(*self.data)        try:            self.assertEquals(self.excepted, res)        except AssertionError as e:            print("该条测试用例执行未通通过")            raise e        else:            print("该条测试用例执行通过")# 创建测试套件suite = unittest.TestSuite()# 调用封装好的读取数据的Excel类,获取测试数据r1 = ReadExcel('cases.xlsx', 'Sheet1')cases = r1.read_data_obj_new([2, 3])# 将测试用例添加至测试套件中for case in cases:    # 需要使用eva()函数对except和data进行自动识别    suite.addTest(RegisterTestCase('test_register', eval(case.excepted), eval(case.data)))# 执行测试套件,生成测试报告with open("report.html", 'wb') as f:    runner = HTMLTestRunner(        stream=f,        verbosity=2,        title='python_test_report',        description='这是一份测试报告',        tester='WL')    runner.run(suite)
微信号:lost-fawn新浪微博:青衫已旧伊人犹在-扫码关注我们-783559c5-ee2f-eb11-8da9-e4434bdf6706.jpeg7a3559c5-ee2f-eb11-8da9-e4434bdf6706.gif戳“阅读原文”我们一起变可爱

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/567670.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

robotFramework-ride使用2-分支与循环

1条件运算 Run keyword if 如果条件为True,则执行关键字 ELSE IF ELSE IF使用案例1: 2循环 在使用append to list前,添加Collections库 列表元素添加与删除 列表元素求和-循环 :FOR ${i} IN 1 2 3 4 5 :FOR ${i} IN RANGE 1 5FOR里面…

项目案例:在线拍卖系统_冀拓公司在张家口开展尾矿库在线监测监控系统 建设项目...

近日,受张家口弘锦矿业有限责任公司委托,冀拓公司在弘锦矿业大东沟尾矿库开展了安全风险智能在线监测监控系统施工安装服务。由于该库为“头顶库”,按照省应急管理厅要求“头顶库”必须在6月底之前完成联网,在6月24日接到项目任务…

Linux 两台服务器之间传输文件和文件夹

今天处理一个项目要迁移的问题,突然发现这么多图片怎么移过去,可能第一时间想到的是先从这台服务器下载下来,然后再上传到另外一台服务器上面去,这个方法确实是可行,但是实在是太费时间了,今天我就教大家怎…

arm汇编指令集_1. 从0开始学ARM安装Keil MDK uVision集成开发环境

关于ARM的一些基本概念,大家可以参考我之前的文章:《0.到底什么是Cortex、ARMv8、arm架构、ARM指令集、soc?一文帮你梳理基础概念【科普】》0. 如何学习arm?ARM的知识点很多很杂,很多同学都遇到过类似的问题&#xff0…

32位存储环境下整数范围为什么是[-2^31,2^31-1]?

一、概念:存储单位 1.“位”是数据存储的最小单位。在计算机中的二进制数系统中,位,简记为bit,也称为比特,每个0或1就是一个位。 2.“字节”是计算机信息技术用于计量存储容量的一种计量单位,通常情况下,…

mysql5.7配置用户名密码_MySQL57安装图解

原文:MySQL57安装图解_ma524654165的博客-CSDN博客作者: ma524654165MySQL57安装图解、、、0-需要准备的安装包1在百度下载MySQl开始安装下载的MySQL勾选同意点击Next4选择Server only5点击execute继续6点击next7直接next8配置服务器的端口-默认9设置一个…

vc6.0添加注释快捷键

第一步:工具 第二步:点击定制(Customize)-键盘-All commands-选择CommentOut,在新建快捷键处填写Ctrl/。

python 释放内存_学了4年C++后,我转向了Python

作者 | asya f 编译 | Lisa C 已经学不动了,现在换 Python 还来得及吗?一位四年工作经验的 C 程序员亲述转型历程,这不仅仅是语言上的转变,而是代码思维甚至工作环境的转变。 通常,程序员会认为 Python 编码比较简单&a…

2021-03-07

一、安装和使用Anaconda 1、anaconda是什么? Anaconda在英文中是“巨蟒”的意思,与python的意思相近,它是python的包管理器和环境管理器。 2、为什么需要安装anaconda? 原因有以下几点: 附带一大批常用的数据科学…

python如何实现模拟登录_超详细的Python实现新浪微博模拟登陆(小白都能懂)

最近由于需要一直在研究微博的爬虫,第一步便是模拟登陆,从开始摸索到走通模拟登陆这条路其实还是挺艰难的,需要一定的经验,为了让朋友们以后少走点弯路,这里我把我的分析过程和代码都附上来。 首先,我们先用…

wacom mac驱动_MAC系统装Wacom手绘板的方法及注意事项

⚠️注意事项⚠️:一般Wacom官网的驱动会比苹果最新系统更新慢很多,所以如果你是最新系统,那官网的驱动你目前肯定用不了!要找客服去单独要。电话:4008105460 如果你刚好是老系统,那么恭喜你~?…

linux mplayer_移植mplayer播放器到EK200开发板的步骤浅析

mplayer是一款开源多媒体播放器,以gnu通用公共许可证发布此款软件可在各主流操作系统使用,一方面它资源占用率低;另一方面,无论是音频还是视频方面,它支持的格式相当全面,能支持播放大部分的音频、视频格式…

printf格式字符串和输出列表个数及类型不匹配案例

printf函数不会进行任何类型转换(包括隐式转换),它只是从内存中读出你所提供的元素的值(按照%d,%f等控制字符提示的格式) void main() {int i10.0/3;float j10.0/3;printf("%d\n",i); //3printf…

脚本自动定时打开链接_自动化构建系统

在软件开发过程中,特别是在一些大型多人合作开发的项目中,如何将各个人开发的不同模块集合为一个完整的系统,最终输出一个完整的目标文件,这个过程包括编译,发布,自动化测试等环节。这一过程的完善程度和流…

++ba--运算结果解析

int db&&a--; 此运算其实的操作为&#xff1a; db&&a,然后aa-1,所以d0&#xff0c;a-1. #include<stdio.h> void main() {/*double a97.3;double b98;double c;int c1;printf("%d\n",(int)(a/b));printf("%f",a/b);*/int a0,b2,…

python docker_Docker实践:python应用容器化

一、前言 容器使用沙箱机制&#xff0c;互相隔离&#xff0c;优势在于让各个部署在容器的里的应用互不影响&#xff0c;独立运行&#xff0c;提供更高的安全性。本文主要介绍python应用&#xff08;django&#xff09;跑在docker容器里&#xff0c;编写dockerfile实现镜像构建自…

mysql 默认事务隔离级别_上个厕所的功夫,搞懂MySQL事务隔离级别

“隔离级别” 出于MySQL四大特性(ACID)中的“I”&#xff0c;也就是隔离性。目的是实现数据、事务一致性“C”。MySQL在多线程并发场景下&#xff0c;可能会出现脏读(dirty read)、不可重复读(non-repeatable read)、幻读(phantom read)这类并发问题&#xff0c;为了解决这些问…

Tg5032smn:高稳定性105℃高温

TG5032SMN是一款频率范围10MHz ~ 54MHz,具有高稳定的TCXO晶振&#xff0c;可与CMOS或限幅正弦输出。外部尺寸5.0 3.2 1.45mm&#xff0c;超小型,质地轻。该系列晶振的额定工作范围-40℃~&#xfe62;105C内可高稳定性工作&#xff0c;使得信号频率的误差很小。TG5032SMN与其他…

泰坦尼克号数据集_机器学习入门—泰坦尼克号生存率预测

项目名称&#xff1a;泰坦尼克号生存率预测1.导入数据这里使用kaggle kernel编写代码数据下载地址为&#xff1a;https://www.kaggle.com/c/titanic2.数据统计分析通过describe和info方法&#xff0c;我们可以发现Age&#xff0c;Cabin&#xff0c;Embarked和Fare的数据都有不同…

firefox flash插件_巧用firefox下载视频资源

技术应用场景&#xff1a;1. 免广告播放视频(含vip)2. 下载各大视频网站的视频资源步骤&#xff1a;1.提前下载安装以下程序&#xff1a;火狐浏览器(Firefox)https://www.lanzous.com/i98jfne火狐flash插件 https://www.lanzous.com/i98jercVideo DownloadHelper插件 https://w…