浅谈python之利⽤pandas和openpyxl读取excel数据在学接⼝⾃动化测试时, 需要从excel中读取测试⽤例的数据, 假如我的数据是这样的:
最好是每⾏数据对应着⼀条测试⽤例, 为⽅便取值, 我选择使⽤pandas库, 先安装 pip install pandas.
然后导⼊:
1import pandas as pd
2 ad_excel('../test_data/test_data.xlsx',sheet_name='hehe')
默认第⼀⾏数据是表头,先来简单了解⼀下pandas的⽤法:
输⼊:
1print(df.head())  # 矩阵式输出,⽆法利⽤数据,忽略
2print(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
输⼊:
1print(df.ix[0,1])  #  第⼆⾏第⼆个数据,B2
2print(df.ix[1].values)    # 第3⾏数据
3print(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]
python怎么读入excel[ 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]]
输⼊:
1print(df.index.values)    # 输出⾏号
lumns.values)      # 输出所有列标题
3print(df['年龄'].values)        #输出指定标题列的数据
4print(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]]
输⼊:
1print(df.ix[1,['学号','年龄']].to_dict()) # 字典的形式输出第三⾏特定列
输出:
{'学号': 2, '年龄': 27}
有表头的情况下, 输出的数据若有多个元素,都是<class 'numpy.ndarray'>的类型的,即[[] [] [] []],⼤列表嵌套多个⼩列表,⼩列表之间没有逗号隔开, 输出的数据若只有⼀个元素,那就是
str或者int.
然⽽, 在⾃动化测试中我们需要的可能是这样的数据:
[{'学号': 1, '姓名': '李连杰', '年龄': 27, '攻击⼒': 96}, {'学号': 2, '姓名': '甄⼦丹', '年龄': 27, '攻击⼒': 93}]
即⼤列表嵌套多字典, 每条字典就是⼀个测试⽤例的数据, 那么怎么取出这种类型的呢?
1 ad_excel('../test_data/test_data.xlsx') #默认第⼀个sheet
2 test_data=[]
3for i in df.index.values:#获取⾏号的索引,并对其进⾏遍历:
4#根据i来获取每⼀⾏指定的数据并利⽤to_dict转成字典
5    row_data=df.ix[i,['学号','姓名','年龄','攻击⼒']].to_dict()
6    test_data.append(row_data)
7print("最终获取到的数据是:{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有很多值,我先输出⼏个看看:
1import pandas as pd
2 ad_excel('../test_data/test_data.xlsx')
3
4print("orient='list'-->",p.to_dict(orient='list')) # <class 'dict'>将表头作为key,将每列的值放在列表中,将列表作为value
5print("orient='index'-->:",p.to_dict(orient='index')) # 将⾏的索引值作为key,将存放数据的字典作为value
6print("orient='records'-->",p.to_dict(orient='records')) # ⼤列表嵌套多字典,适合测试⽤例
_dict(orient='dict'))
_dict(orient='split'))
结果:
1 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]}
2 orient='index'-->: {0: {'学号': 1, '姓名': '李连杰', '年龄': 27, '攻击⼒': 96}, 1: {'学号': 2, '姓名': '甄⼦丹', '年龄': 27, '攻击⼒': 93}, 2: {'学号': 3, '姓名': '成龙', '年龄': 36, '攻击⼒': 90}, 3: {'学号': 4, '姓名': '洪⾦宝', '年龄': 38, '攻击⼒': 89}, 4: {'学号
3 orient='records'--> [{'学号': 1, '姓名': '李连杰', '年龄': 27, '攻击⼒': 96}, {'学号': 2, '姓名': '甄⼦丹', '年龄': 27, '攻击⼒': 93}, {'学号': 3, '姓名': '成龙', '年龄': 36, '攻击⼒': 90}, {'学号': 4, '姓名': '洪⾦宝', '年龄': 38, '攻击⼒': 89}, {'学号': 5, '姓名': '
4 {'学号': {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 {'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中取出测试数据的事情, 好开⼼!
1 ad_excel('../test_data/test_data.xlsx')
_dict(orient='records'))
取出数据测试完毕后想写回测试结果该怎么办呢,这就要谈谈另⼀个模块了:openpyxl
这⾥我把读取数据写成⼀个类, 利⽤openpyxl也可以拿出⼤列表嵌套多字典的数据类型, 但稍微⿇烦了点, 不过它还可以写回数据. 如下: 1from openpyxl import load_workbook
ad_config import ReadConfig
3
4class ReadExcel:
5    button = ReadConfig().read_config('fig','MOD','button')
6def read_excel_openpyxl(self,file_name,sheet_name):
7'''从excel读取数据并以⼤列表嵌套多字典的形式输出'''
8        wb=load_workbook(file_name)
9        sheet=wb[sheet_name]
10        tit = []
11        test_data = []
12        row = sheet.max_row + 1
13        column = sheet.max_column + 1
14for i in range(1, row):
15            ele = {}
16for j in range(1, column):
17if i == 1:
18                    res = ll(i, j).value
19                    tit.append(res)
20else:
21                    ele[tit[j - 1]] = ll(i, j).value
22            test_data.append(ele)  # 此时的test_data⾥⾯第⼀个是空列表
23
24        test_data_new = []
25for item in test_data:
26if item != {}:  # 去除空列表
27                test_data_new.append(item)
_which_row(test_data_new)
29
30def write_back_unittest(self,file_name,sheet_name,value,row,cloumn):
31'''unittest框架⽤这个'''
32        wb=load_workbook(file_name)
33        sheet=wb[sheet_name]
34        ll(row,cloumn).value=value
35        wb.save(file_name)
36
37def get_which_row(self,test_data_new):
38'''根据button值决定取出哪些⾏的数据作为测试⽤例'''
39        test_data_final=[]
40if self.button == 'all':
41return test_data_new
42else:
43for i in eval(self.button):  # 配置⽂件⾥button的值是字符串类型,切记
44                test_data_final.append(test_data_new[i-1])
45return test_data_final
END

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。