浅谈python之利用pandas和openpyxl读取excel数据

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

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

然后导入:

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

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

输入:

1 print(df.head())  # 矩阵式输出,无法利用数据,忽略
2 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

输入:

1 print(df.ix[0,1])  #  第二行第二个数据,B2
2 print(df.ix[1].values)    # 第3行数据
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]]

输入:

1 print(df.index.values)     # 输出行号 
2 print(df.columns.values)      # 输出所有列标题
3 print(df['年龄'].values)        #输出指定标题列的数据
4 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]]

输入:

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

 输出:

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

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

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

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

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

1 df=pd.read_excel('../test_data/test_data.xlsx') #默认第一个sheet
2 test_data=[]
3 for i in df.index.values:#获取行号的索引,并对其进行遍历:
4     #根据i来获取每一行指定的数据 并利用to_dict转成字典
5     row_data=df.ix[i,['学号','姓名','年龄','攻击力']].to_dict()
6     test_data.append(row_data)
7 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有很多值,我先输出几个看看:

1 import pandas as pd
2 p=pd.read_excel('../test_data/test_data.xlsx')
3 
4 print("orient='list'-->",p.to_dict(orient='list')) # <class 'dict'>将表头作为key,将每列的值放在列表中,将列表作为value
5 print("orient='index'-->:",p.to_dict(orient='index')) # 将行的索引值作为key,将存放数据的字典作为value
6 print("orient='records'-->",p.to_dict(orient='records')) # 大列表嵌套多字典,适合测试用例
7 print(p.to_dict(orient='dict'))
8 print(p.to_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: {'学号': 5, '姓名': '吴京', '年龄': 16, '攻击力': 91}, 5: {'学号': 6, '姓名': '李小龙', '年龄': 50, '攻击力': 100}, 6: {'学号': 7, '姓名': '赵文卓', '年龄': 18, '攻击力': 92}, 7: {'学号': 8, '姓名': '刘亦菲', '年龄': 3, '攻击力': 1}}
3 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}]
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: 100, 6: 92, 7: 1}}
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 p=pd.read_excel('../test_data/test_data.xlsx')
2 print(p.to_dict(orient='records'))

 



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

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

 1 from openpyxl import load_workbook
 2 from tools.read_config import ReadConfig
 3 
 4 class ReadExcel:
 5     button = ReadConfig().read_config('case.config','MOD','button')
 6     def 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
14         for i in range(1, row):
15             ele = {}
16             for j in range(1, column):
17                 if i == 1:
18                     res = sheet.cell(i, j).value
19                     tit.append(res)
20                 else:
21                     ele[tit[j - 1]] = sheet.cell(i, j).value
22             test_data.append(ele)  # 此时的test_data里面第一个是空列表
23 
24         test_data_new = []
25         for item in test_data:
26             if item != {}:  # 去除空列表
27                 test_data_new.append(item)
28         return self.get_which_row(test_data_new)
29 
30     def 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         sheet.cell(row,cloumn).value=value
35         wb.save(file_name)
36 
37     def get_which_row(self,test_data_new):
38         '''根据button值决定取出哪些行的数据作为测试用例'''
39         test_data_final=[]
40         if self.button == 'all':
41             return test_data_new
42         else:
43             for i in eval(self.button):  # 配置文件里button的值是字符串类型,切记!!!
44                 test_data_final.append(test_data_new[i-1])
45             return test_data_final

写一篇随笔很费时间呀, 各位看官觉得对你有点用的话就点个赞鼓励一下吧,谢谢!

 

转载于:https://www.cnblogs.com/wangyi0419/p/11280760.html

  • 6
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Python3使用Pandas可以读取Excel数据。具体步骤如下: 1. 安装Pandas 在终端输入以下命令: ``` pip install pandas ``` 2. 导入PandasPython代码导入Pandas: ```python import pandas as pd ``` 3. 读取Excel数据 使用Pandas的read_excel()函数可以读取Excel数据。例如,读取名为“data.xlsx”的Excel文件: ```python df = pd.read_excel('data.xlsx') ``` 其,df是一个DataFrame对象,包含了Excel文件的所有数据。 4. 处理Excel数据 可以使用Pandas的各种函数对Excel数据进行处理,例如筛选、排序、统计等操作。 ```python # 筛选出“年龄”列大于20的数据 df[df['年龄'] > 20] # 按“年龄”列升序排序 df.sort_values('年龄', ascending=True) # 统计“性别”列男女人数 df['性别'].value_counts() ``` 以上就是Python3使用Pandas读取Excel数据的基本步骤。 ### 回答2: Python是一种非常流行的编程语言,广泛应用于数据分析、人工智能等领域。在数据处理方面,Pythonpandas是非常常用的一个工具,可以读取Excel文件数据并进行处理。 首先,我们需要安装pandas。在命令行输入以下命令: ```python pip install pandas ``` 成功安装后,我们就可以开始读取Excel数据了。使用pandas的read_excel函数来读取Excel文件,该函数有两个必选参数:文件路径和要读取单名称。 ```python import pandas as pd filepath = "excel_file.xlsx" df = pd.read_excel(filepath, sheet_name="Sheet1") ``` 上述代码,我们通过 pd.read_excel() 函数读取excel_file.xlsx 文件的 Sheet1 数据,并将其存储在变量 df 。此时,变量 df 就是一个 pandas的 DataFrame类型,我们可以像操作普通的二维数组一样对其进行操作。 为了进一步了解pandas数据处理能力,我们可以使用一些基本的pandas操作,例如, 1. 查看数据结构: ```python # 查看前5条数据 print(df.head()) # 查看数据行数和列数 print(df.shape) # 查看每列的数据类型 print(df.dtypes) # 查看列名 print(df.columns) # 查看数据统计信息 print(df.describe()) ``` 2. 选择数据 ```python # 选择一列数据 col = df['column1'] # 选择多列数据 cols = df[['column1', 'column2']] # 选择一行数据 row = df.loc[0] # 选择多行数据 rows = df.loc[0:5] # 选择特定位置的数据 value = df.loc[0, 'column1'] ``` 3. 数据处理 ```python # 新增一列数据 df['new_column'] = df['column1'] + df['column2'] # 修改数据 df.loc[0, 'column1'] = "new_value" # 删除一列数据 df = df.drop('column1', axis=1) # 根据条件筛选数据 select_rows = df[df['column1'] > 10] # 合并两个DataFrame df2 = pd.read_excel('excel_file2.xlsx') df3 = pd.merge(df1, df2, on='key_column') ``` 通过这些操作,我们可以实现对Excel文件数据进行自由处理和转换。当然,本篇只是对pandas读取Excel数据和基本操作的简单介绍,pandas具有非常强大的数据处理及分析功能,在实际业务场景,可以使用pandas轻松处理各种数据。 ### 回答3: Python 是一门非常流行的编程语言,而 Pandas 则是 Python 语言的一个数据分析工具包。在 Pandas 读取 Excel 数据非常方便,我们只需要使用 read_excel 函数即可实现。下面来详细介绍如何使用 Pandas 读取 Excel 数据。 首先,我们需要安装 Pandas,打开终端(Windows 用户为命令行),输入以下命令即可安装: ``` pip install pandas ``` 安装完成后,我们可以使用 Pandas 的 read_excel 函数来读取 Excel 数据。其,read_excel 函数需要指定 Excel 文件的路径以及数据所在的 sheet 名称,具体代码如下所示: ``` import pandas as pd df = pd.read_excel('path/to/excel/file.xlsx', sheet_name='Sheet1') ``` 其,'path/to/excel/file.xlsx' Excel 文件所在的路径,'Sheet1' 数据所在的 sheet 名称。读取完成后,我们将数据存储在变量 df 。 除此之外,read_excel 函数还可以指定一些其他参数,以满足不同的需求。例如,我们可以使用 header 参数来指定哪一行作为数据头。如果数据没有头,我们可以将 header 参数设置为 None,这样 Pandas 将使用默认的头(即从 0 开始的整数)。 下面是一个完整的示例代码读取 Excel 数据并输出前 5 行: ``` import pandas as pd df = pd.read_excel('path/to/excel/file.xlsx', sheet_name='Sheet1', header=0) print(df.head()) ``` 通过 Pandas 的 read_excel 函数,我们可以轻松地读取 Excel 数据,并进行数据分析和处理,从而实现更加高效和准确的数据分析。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值