在学接口自动化测试时, 需要从excel中读取测试用例的数据, 假如我的数据是这样的:

最好是每行数据对应着一条测试用例, 为方便取值, 我选择使用pandas库, 先安装 pip install pandas.

然后导入:

 import pandas as pd
df=pd.read_excel('../test_data/test_data.xlsx',sheet_name='hehe')

默认第一行数据是表头,先来简单了解一下pandas的用法:

输入:

 print(df.head())  # 矩阵式输出,无法利用数据,忽略
print(df.ix[0]) # 索引从第二行开始,0表示表中的第二行,表头与行数据成映射关系

输出:

学号 姓名 年龄 攻击力
0 1 李连杰 27 96
1 2 甄子丹 27 93
2 3 成龙 36 90
3 4 洪金宝 38 89
4 5 吴京 16 91

学号 1
姓名 李连杰
年龄 27
攻击力 96

输入:

 print(df.ix[0,1])  #  第二行第二个数据,B2
print(df.ix[1].values) # 第3行数据
print(df.ix[[1,2]].values) # 第3,4行数据,注意输出多行里面应该要嵌套列表

输出:

李连杰

[2 '甄子丹' 27 93]

[ [2 '甄子丹' 27 93]
[3 '成龙' 36 90] ]

输入:

print(df.ix[[1,2],['年龄']].values)  #3,4行里输出表头为'年龄'的列的数据,嵌套列表
print(df.ix[:,['攻击力']].values) # 输出所有行的表头为'攻击力'的列的数据,即D2-D9,嵌套列表
print(df.ix[:].values) # 输出所有行
print(df.values) # 输出所有行,结果与上一样

输出:

[[27]
[36]]

[[ 96]
[ 93]
[ 90]
[ 89]
[ 91]
[100]
[ 92]
[ 1]]

[[1 '李连杰' 27 96]
[2 '甄子丹' 27 93]
[3 '成龙' 36 90]
[4 '洪金宝' 38 89]
[5 '吴京' 16 91]
[6 '李小龙' 50 100]
[7 '赵文卓' 18 92]
[8 '刘亦菲' 3 1]]

输入:

 print(df.index.values)     # 输出行号
print(df.columns.values) # 输出所有列标题
print(df['年龄'].values) #输出指定标题列的数据
print(df.sample(3).values) #随机输出三行数据

输出:

[0 1 2 3 4 5 6 7]

['学号' '姓名' '年龄' '攻击力']

[27 27 36 38 16 50 18 3]

[[3 '成龙' 36 90]
[6 '李小龙' 50 100]
[7 '赵文卓' 18 92]]

输入:

 print(df.ix[1,['学号','年龄']].to_dict()) # 字典的形式输出第三行特定列

输出:

{'学号': 2, '年龄': 27}

有表头的情况下, 输出的数据若有多个元素,都是<class 'numpy.ndarray'>的类型的,即[[] [] [] []],大列表嵌套多个小列表,小列表之间没有逗号隔开, 输出的数据若只有一个元素,那就是str或者int.

然而, 在自动化测试中我们需要的可能是这样的数据:

[{'学号': 1, '姓名': '李连杰', '年龄': 27, '攻击力': 96}, {'学号': 2, '姓名': '甄子丹', '年龄': 27, '攻击力': 93}]

即大列表嵌套多字典, 每条字典就是一个测试用例的数据, 那么怎么取出这种类型的呢?

 df=pd.read_excel('../test_data/test_data.xlsx') #默认第一个sheet
test_data=[]
for i in df.index.values:#获取行号的索引,并对其进行遍历:
#根据i来获取每一行指定的数据 并利用to_dict转成字典
row_data=df.ix[i,['学号','姓名','年龄','攻击力']].to_dict()
test_data.append(row_data)
print("最终获取到的数据是:{0}".format(test_data))

输出:

最终获取到的数据是:[{'学号': 1, '姓名': '李连杰', '年龄': 27, '攻击力': 96}, 
          {'学号': 2, '姓名': '甄子丹', '年龄': 27, '攻击力': 93},
          {'学号': 3, '姓名': '成龙', '年龄': 36, '攻击力': 90},
          {'学号': 4, '姓名': '洪金宝', '年龄': 38, '攻击力': 89},
          {'学号': 5, '姓名': '吴京', '年龄': 16, '攻击力': 91},
          {'学号': 6, '姓名': '李小龙', '年龄': 50, '攻击力': 100},
          {'学号': 7, '姓名': '赵文卓', '年龄': 18, '攻击力': 92},
          {'学号': 8, '姓名': '刘亦菲', '年龄': 3, '攻击力': 1}]

怎么样,大功告成了吧, 然而你会说, 好麻烦呀,有简单点的方法吗?哈哈,有!

我们来看to_dict方法:

作用是把数据格式转换成字典型的,两个参数,into不管它,前面orient有很多值,我先输出几个看看:

 import pandas as pd
p=pd.read_excel('../test_data/test_data.xlsx') print("orient='list'-->",p.to_dict(orient='list')) # <class 'dict'>将表头作为key,将每列的值放在列表中,将列表作为value
print("orient='index'-->:",p.to_dict(orient='index')) # 将行的索引值作为key,将存放数据的字典作为value
print("orient='records'-->",p.to_dict(orient='records')) # 大列表嵌套多字典,适合测试用例
print(p.to_dict(orient='dict'))
print(p.to_dict(orient='split'))

结果:

 orient='list'--> {'学号': [1, 2, 3, 4, 5, 6, 7, 8], '姓名': ['李连杰', '甄子丹', '成龙', '洪金宝', '吴京', '李小龙', '赵文卓', '刘亦菲'], '年龄': [27, 27, 36, 38, 16, 50, 18, 3], '攻击力': [96, 93, 90, 89, 91, 100, 92, 1]}
orient='index'-->: {0: {'学号': 1, '姓名': '李连杰', '年龄': 27, '攻击力': 96}, 1: {'学号': 2, '姓名': '甄子丹', '年龄': 27, '攻击力': 93}, 2: {'学号': 3, '姓名': '成龙', '年龄': 36, '攻击力': 90}, 3: {'学号': 4, '姓名': '洪金宝', '年龄': 38, '攻击力': 89}, 4: {'学号': 5, '姓名': '吴京', '年龄': 16, '攻击力': 91}, 5: {'学号': 6, '姓名': '李小龙', '年龄': 50, '攻击力': 100}, 6: {'学号': 7, '姓名': '赵文卓', '年龄': 18, '攻击力': 92}, 7: {'学号': 8, '姓名': '刘亦菲', '年龄': 3, '攻击力': 1}}
orient='records'--> [{'学号': 1, '姓名': '李连杰', '年龄': 27, '攻击力': 96}, {'学号': 2, '姓名': '甄子丹', '年龄': 27, '攻击力': 93}, {'学号': 3, '姓名': '成龙', '年龄': 36, '攻击力': 90}, {'学号': 4, '姓名': '洪金宝', '年龄': 38, '攻击力': 89}, {'学号': 5, '姓名': '吴京', '年龄': 16, '攻击力': 91}, {'学号': 6, '姓名': '李小龙', '年龄': 50, '攻击力': 100}, {'学号': 7, '姓名': '赵文卓', '年龄': 18, '攻击力': 92}, {'学号': 8, '姓名': '刘亦菲', '年龄': 3, '攻击力': 1}]
{'学号': {0: 1, 1: 2, 2: 3, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8}, '姓名': {0: '李连杰', 1: '甄子丹', 2: '成龙', 3: '洪金宝', 4: '吴京', 5: '李小龙', 6: '赵文卓', 7: '刘亦菲'}, '年龄': {0: 27, 1: 27, 2: 36, 3: 38, 4: 16, 5: 50, 6: 18, 7: 3}, '攻击力': {0: 96, 1: 93, 2: 90, 3: 89, 4: 91, 5: 100, 6: 92, 7: 1}}
{'index': [0, 1, 2, 3, 4, 5, 6, 7], 'columns': ['学号', '姓名', '年龄', '攻击力'], 'data': [[1, '李连杰', 27, 96], [2, '甄子丹', 27, 93], [3, '成龙', 36, 90], [4, '洪金宝', 38, 89], [5, '吴京', 16, 91], [6, '李小龙', 50, 100], [7, '赵文卓', 18, 92], [8, '刘亦菲', 3, 1]]}

发现我们测试需要的数据格式也在其中, 那就是orient='records', 所以两行代码解决了从excel中取出测试数据的事情, 好开心!

 p=pd.read_excel('../test_data/test_data.xlsx')
print(p.to_dict(orient='records'))

取出数据测试完毕后想写回测试结果该怎么办呢,这就要谈谈另一个模块了:openpyxl

这里我把读取数据写成一个类, 利用openpyxl也可以拿出大列表嵌套多字典的数据类型, 但稍微麻烦了点, 不过它还可以写回数据. 如下:

 from openpyxl import load_workbook
from tools.read_config import ReadConfig class ReadExcel:
button = ReadConfig().read_config('case.config','MOD','button')
def read_excel_openpyxl(self,file_name,sheet_name):
'''从excel读取数据并以大列表嵌套多字典的形式输出'''
wb=load_workbook(file_name)
sheet=wb[sheet_name]
tit = []
test_data = []
row = sheet.max_row + 1
column = sheet.max_column + 1
for i in range(1, row):
ele = {}
for j in range(1, column):
if i == 1:
res = sheet.cell(i, j).value
tit.append(res)
else:
ele[tit[j - 1]] = sheet.cell(i, j).value
test_data.append(ele) # 此时的test_data里面第一个是空列表 test_data_new = []
for item in test_data:
if item != {}: # 去除空列表
test_data_new.append(item)
return self.get_which_row(test_data_new) def write_back_unittest(self,file_name,sheet_name,value,row,cloumn):
'''unittest框架用这个'''
wb=load_workbook(file_name)
sheet=wb[sheet_name]
sheet.cell(row,cloumn).value=value
wb.save(file_name) def get_which_row(self,test_data_new):
'''根据button值决定取出哪些行的数据作为测试用例'''
test_data_final=[]
if self.button == 'all':
return test_data_new
else:
for i in eval(self.button): # 配置文件里button的值是字符串类型,切记!!!
test_data_final.append(test_data_new[i-1])
return test_data_final

END

浅谈python之利用pandas和openpyxl读取excel数据的更多相关文章

  1. 【python接口自动化】- openpyxl读取excel数据

    前言:目前我们进行测试时用于存储测试数据的软件几乎都是excel,excel方便存储和管理数据,读取数据时也比较清晰,测试时我们需要从excel从读取测试数据,结束后还需把测试结果写入到excel中, ...

  2. openpyxl读取Excel数据

    #! Python3 #-*- coding:utf8 -*- import openpyxl #载入表格内容 wb=openpyxl.load_workbook('e:\\work\\newFile ...

  3. 【原创】python+selenium,用xlrd,读取excel数据,执行测试用例

    # -*- coding: utf-8 -*- import unittest import time from selenium import webdriver import xlrd,xlwt ...

  4. 浅谈Python时间模块

    浅谈Python时间模块 今天简单总结了一下Python处理时间和日期方面的模块,主要就是datetime.time.calendar三个模块的使用.希望这篇文章对于学习Python的朋友们有所帮助 ...

  5. 浅谈Python在信息学竞赛中的运用及Python的基本用法

    浅谈Python在信息学竞赛中的运用及Python的基本用法 前言 众所周知,Python是一种非常实用的语言.但是由于其运算时的低效和解释型编译,在信息学竞赛中并不用于完成算法程序.但正如LRJ在& ...

  6. 浅谈python字符串存储形式

    http://blog.csdn.net/zhonghuan1992 钟桓 2014年8月31日 浅谈python字符串存储形式 记录一下自己今的天发现疑问而且给出自己现有知识有的回答. 长话短说,用 ...

  7. 开发技术--浅谈Python函数

    开发|浅谈Python函数 函数在实际使用中有很多不一样的小九九,我将从最基础的函数内容,延伸出函数的高级用法.此文非科普片~~ 前言 目前所有的文章思想格式都是:知识+情感. 知识:对于所有的知识点 ...

  8. 开发技术--浅谈python数据类型

    开发|浅谈python数据类型 在回顾Python基础的时候,遇到最大的问题就是内容很多,而我的目的是回顾自己之前学习的内容,进行相应的总结,所以我就不玩基础了,很多在我实际生活中使用的东西,我会在文 ...

  9. 开发技术--浅谈python基础知识

    开发|浅谈python基础知识 最近复习一些基础内容,故将Python的基础进行了总结.注意:这篇文章只列出来我觉得重点,并且需要记忆的知识. 前言 目前所有的文章思想格式都是:知识+情感. 知识:对 ...

随机推荐

  1. 最近上传图片上传文件报413错误及仅Https下报413问题,IIS高版本的配置方案及Web.config配置全解

    IIS文件上传大小限制30M,C盘中有的IIS_schema.xml文件 C:\Windows\System32\inetsrv\config\schema\ 但是考虑到安全等问题,而且这个文件默认是 ...

  2. node、npm、chrome、v8、sandbox是什么?

    这些东西有些比较常用,有些仅知道个名称,但无论是熟悉还是陌生的,要比较精确地解释这些东西,是有一定的难度,可这些东西对前端开发非常重要,还是需要有明确的概念. PS:内容点到即止,不然一个东西一篇文章 ...

  3. 51-overlay 是如何隔离的?

    不同的 overlay 网络是相互隔离的.我们创建第二个 overlay 网络 ov_net2 并运行容器 bbox3. bbox3 分配到的 IP 是 10.0.1.2,尝试 ping bbox1( ...

  4. 45-管理 Machine

    用 docker-machine 创建 machine 的过程很简洁,非常适合多主机环境.除此之外,Docker Machine 也提供了一些子命令方便对 machine 进行管理.其中最常用的就是无 ...

  5. Linux(Centos7)下redis5集群搭建和使用

    1.简要说明 2018年十月 Redis 发布了稳定版本的 5.0 版本,推出了各种新特性,其中一点是放弃 Ruby的集群方式,改为 使用 C语言编写的 redis-cli的方式,是集群的构建方式复杂 ...

  6. datatable的dom配置

    l - Length changing 改变每页显示多少条数据的控件 f - Filtering input 即时搜索框控件 t - The Table 表格本身 i - Information 表格 ...

  7. leetcode题解:回文数

    判断一个整数是否是回文数.回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数. 示例 1: 输入: 121 输出: true 示例 2: 输入: -121 输出: false 解释: 从左向 ...

  8. 十一、Powell算法(鲍威尔算法)原理以及实现

    一.介绍 Powell算法是图像配准里面的常用的加速算法,可以加快搜索速度,而且对于低维函数的效果很好,所以本篇博客主要是为了介绍Powell算法的原理以及实现. 由于网上已经有了对于Powell算法 ...

  9. linux的装配与虚拟机的快照

    一.科普 1969年,“c语言之父”,“b语言之父”,ken Thompson,开发了一个叫unics系统,是unix系统的雏形,只不过此时的UNICS是用汇编语言写的.移植到其它计算机上需要改很多源 ...

  10. verilog常见错误列表

    Error/Warning 来源:https://hdlbits.01xz.net/wiki/ 题目: 1.Quartus Warning 10235: Warning (): Verilog HDL ...