前言
Python中想要对Excel文件数据的处理,通常需要使用第三方库openpyxl、pandas。下面我将分别介绍这两种库用于处理测试数据的一些用法(我想要的测试数据格式为[{ },{ }…{ }],其中字典的key是对应文件的表头,value是对应字段的值)。
openpyxl库处理Excel
【处理流程】
1.导入对应的第三方库(from openpyxl import load_workbook)
2.找到想要操作文件的路径后打开excel对象(wb=load_workbook(想要打开文件的路径(为了拓展最好是相对路径)))
3.获取表单对象(sh=wb[“Excel中对应的sheet页名称”])
4.通过坐标获取对应的内容(value=sh.cell(坐标).value)
注意!使用openpyxl库逐字段获取数据时下标要从(1,1)开始。当获取的单元格值为空时,返回None
5. 逐个单元格获取:先获取表头,然后逐行逐单元格获取对应的值,并且与表头一一对应。
def read_excel(self):
#定义空列表1,用于存放表表头字段
data_title = []
# sh.max_column+1是因为使用openpyxl库时坐标要从(1,1)开始
for col in range(1, self.sh.max_column+1):
# 通过for循环将每个表头数据放入列表中
data_title.append(self.sh.cell(1, col).value)
# 定义空列表2用于存放最终的测试数据
data_value = []
# range(2, self.sh.max_row+1)这里取2是因为第一行是表头数据,我们需要取的是表头以外的数据
#第一层循环需要遍历除表头外所有的行
for row in range(2, self.sh.max_row+1):
#每次循环都定义一个空字典用于存放非表头数据。基于字典key-value的数据结构,实现表字段与对应数据的对应
data_dict = {}
#第二层循环需要对每一列的数据进行遍历
for col in range(1, self.sh.max_column+1):
#data_title[col-1]是因为列表的下标是从0开始的,而我们的col是从1开始自增的
data_dict[data_title[col-1]] = self.sh.cell(row, col).value
#第二个循环每次遍历的结果都是一个字典,第二个循环完成之后,会重新开始第一层循环
#使用append将第二次循环的结果加入列表,得到的数据样式为[{字典1},{字典2}]
data_value.append(data_dict)
#最终完成所有数据的汇总
return data_value
逐行获取:
def read_excel12(self):
#定义空列表1保存表头字段
list_title = []
#list(self.sh.rows)[0]使用list这个工厂函数是因为sh.rows的结果是一个generator(可迭代对象)
#对该对象进行切片是为了获取表头行的信息
for i in list(self.sh.rows)[0]:
#通过第一层循环,此时i是openpyxl的cell对象,因此获取数据需要使用i.value方法
list_title.append(i.value)
#创建一个新的列表,存放除表头行以外最终结果
list_value = []
#list(self.sh.rows)[1:]是由于list(self.sh.rows)整体就是列表,使用切片将表头行分隔开
for row in list(self.sh.rows)[1:]:
#定义一个列表,存放行对象具体的值,此时j的类型为一个cell对象
case_list = []
for j in row:
#cell.value 用于读取和修改单元格的实际内容
case_list.append(j.value)
#zip函数主要作用是将多个可迭代对象(如列表、元组、字典视图等)中相对应位置的元素打包成一个个元组(tuple),
#形成一个新的迭代器(iterator),想要访问该迭代器需要使用工厂函数(list、dict)将其转换为一个可迭代对象或者通过for循环访问
tuple_value = dict(zip(list_title, case_list))
list_value.append(tuple_value)
return list_value
修改excel中的数据
【修改指定单元格数据】
可通过指定下标实现数据修改,也可通过for循环完成指定列、指定行数据更改
保存修改的内容时,需要保证原本的Excel文件处于关闭状态
使用workbook创建一个Excel文件,并向里面写入内容
思路:使用openpyxl库中的Workbook包--------声明Workbook对象--------使用声明的对象去声明一个默认的sheet页
使用声明的sheet页对象添加列名------通过循环,使用声明的sheet页对象逐行添加Excel的内容-----使用声明的
Workbook对象存储内容
注意!openpyxl主要用于处理.xlsx格式的文件,openpyxl库不能直接处理csv文件。
pandas处理Excel
【读取csv文件】
def read_csv_pandas(self):
csv_path = data_path + "/test1.csv"
df = pd.read_csv(csv_path)
# df.to_dict():此方法将DataFrame对象df转换为字典类型,当指定 'records' 作为to_dict()方法的参数时,
#它指示将DataFrame的每一行数据转换为一个独立的字典,每个字典的键是DataFrame的列名
data_dict = df.to_dict('records')
return data_dict
【读取xlsx、xlsx文件】
def read_excel_pandas(self):
# 使用pandas读取数据时,需要注意header熟悉,为None表示表头也作为数据行,不为None不读取表头,只读取数据行。默认为 None
# 读取的结果是一个DataFrame数据结构
df = pd.read_excel(self.path)
if pd.__version__ >= '1.0.0':
#使用pandas库中自带的replace函数对DataFrame进行操作,它接受一个映射(通常为字典),其中键代表要被替换的原始值,值代表替换后的目标值。
df = df.replace({pd.NA: None, '': None, np.nan: None}) # 在 Pandas 中,当读取 CSV 文件时遇到空值(如空字符串或空单元格)
else:
print("进入1.0以下的逻辑") # 默认情况下它们会被解析为 NaN(Not a Number)
df = df.replace({np.nan: None, '': None})
# 将pandas.DataFrame对象转换为字典列表(即字典构成的列表),并将其赋值给变量data
# 使用 ‘records’时 to_dict()会将DataFrame的每一行数据转换为一个字典,每个字典的键是列名
data = df.to_dict('records')
return data
学海无涯