python获取excel表头并封装

本文介绍了一种在Python中操作Excel文件的方法,通过定义表头为常量,实现了对Excel表头的封装,便于后续的数据操作与管理。文章详细列举了包括case_id、模块名、url等在内的多个表头常量,并提供了获取这些常量值的函数。

 如下所示的excel,定义表头为常量,方便操作excel时获取

表头常量定义并封装

# -*- coding: utf-8 -*-
class global_var:
    ID ='0' #case_id
    REQUEST_NAME='1'   #模块
    URL='2' #url
    IS_RUN='3' #是否运行
    METHOD='4' #请求类型
    HEADER='5' #是否携带header
    CASE_DEPEND='6' #case依赖
    DATA_DEPEND='7' #依赖的返回数据
    FILED_DEPEND='8' #数据依赖字段
    DATA='9' #请求数据
    EXPECT='10' #预期结果
    RESULT='11' #实际结果

    #获取caseid
    def get_id():
        return golbal_var.ID

    #获取模块名称
    def get_request_name():
        return golbal_var.REQUEST_NAME

    #获取url
    def get_url():
        return golbal_var.REQUEST_NAME

    #获取is_run
    def get_is_run():
        return golbal_var.IS_RUN

    #获取method请求类型
    def get_method():
        return golbal_var.METHOD

    #获取header
    def get_header():
        return HEADER

    #获取case依赖
    def get_case_depend():
        return CASE_DEPEND

    #获取依赖的返回数据
    def get_data_depend():
        return DATA_DEPEND

    #获取数据依赖字段
    def get_filed_depend():
        return FILED_DEPEND

    #获取请求数据
    def get_data():
        return DATA

    #获取预期结果
    def get_expect():
        return EXPECT

    #获取实际结果
    def get_result():
        return RESULT

 

转载于:https://www.cnblogs.com/cythia2018/p/10238504.html

<think>我们有一个需求:读取Excel文件将每一行数据封装为一个对象(类的实例)。 步骤: 1. 读取Excel文件获取所有行。 2. 通常第一行是列名(字段名),其余行是数据。 3. 定义一个类,其属性对应Excel的列名。 4. 遍历数据行,为每一行创建一个该类的实例,将对应列的值赋给实例的属性。 我们可以使用第三方库`xlrd`来读取Excel文件(注意:xlrd在2.0.1版本后不支持xlsx格式,若需要读取xlsx,可以使用openpyxl或xlrd的1.2.0版本)。但根据引用中提到的,用户使用了xlrd3(即xlrd的fork版本,支持Python3和xlsx格式?),但这里我们假设使用xlrd(注意版本问题)或使用openpyxl。 由于用户之前提到封装读取excel的方法,我们参考引用[1]和[2]中的方法,但需要扩展为对象映射。 我们有两种方式: 方式一:使用xlrd(适合xls格式,对于xlsx,如果版本不支持,则需注意) 方式二:使用openpyxl(支持xlsx) 这里我们以xlrd为例(因为引用中使用了xlrd),但注意:如果用户使用的是xlsx文件,可能需要使用其他库。但为了通用性,我们可以先按xlrd处理,提醒用户注意文件格式。 步骤: 1. 定义类,例如:class MyData: def __init__(self, **kwargs): for key, value in kwargs.items(): setattr(self, key, value) 2. 读取Excel获取表。 3. 获取第一行作为属性名(字段名)。 4. 从第二行开始遍历,将每一行的数据与字段名组合成字典,然后创建对象。 但是,我们也可以动态创建类,或者预先定义类。这里为了灵活性,我们可以动态将列名作为属性。 然而,更常见的做法是预先知道我们要映射的类,或者根据列名动态创建类。 为了简单,我们假设列名是已知的,且我们有一个对应的类。但为了通用,我们可以创建一个通用的数据对象。 示例: 假设Excel文件内容如下: | Name | Age | Gender | |-------|-----|--------| | Alice | 25 | Female | | Bob | 30 | Male | 我们希望每一行是一个对象,例如: 对象1:Name='Alice', Age=25, Gender='Female' 对象2:Name='Bob', Age=30, Gender='Male' 我们可以定义一个类: class Person: def __init__(self, name, age, gender): self.name = name self.age = age self.gender = gender 但是,如果列名不固定,我们可以使用一个通用的类,比如: class RowObject: def __init__(self, **kwargs): self.__dict__.update(kwargs) 然后,读取每一行时,将列名和该行的值组成一个字典,然后传入RowObject。 具体步骤: 1. 打开Excel文件获取第一个工作表(或指定工作表)。 2. 读取第一行作为列名(keys)。 3. 读取后续行,对于每一行,将列名和该行的值组成一个字典。 4. 使用这个字典创建RowObject实例。 注意:xlrd读取的单元格值可能是数字、字符串等,但日期会被读取为浮点数,需要转换。 下面我们写一个函数来实现: 参考引用[1]中封装获取表的方法,我们在此基础上扩展。 封装一个类ExcelReader,用于读取Excel将每行数据转换为对象。 代码示例:</think>以下是将 Excel 行数据封装Python 对象的完整解决方案: ### 解决方案思路 1. **读取 Excel 文件**:使用 `xlrd` 库读取 Excel 数据 2. **动态创建类**:根据 Excel 表头动态生成数据类 3. **行数据映射**:将每行数据转换为类实例 4. **类型处理**:自动识别数字、日期等数据类型 ### 完整实现代码 ```python import xlrd from datetime import datetime from typing import List, Type class ExcelMapper: def __init__(self, file_path: str, sheet_index: int = 0): """ 初始化 Excel 映射器 :param file_path: Excel 文件路径 :param sheet_index: 工作表索引(默认第一个工作表) """ self.file_path = file_path self.sheet_index = sheet_index self.workbook = xlrd.open_workbook(file_path) self.sheet = self.workbook.sheet_by_index(sheet_index) def _create_data_class(self, class_name: str) -> Type: """ 动态创建数据类 :param class_name: 类名称 :return: 数据类类型 """ # 获取表头作为属性名 headers = [str(self.sheet.cell_value(0, col)).strip() for col in range(self.sheet.ncols)] return type(class_name, (object,), {header: None for header in headers}) def map_to_objects(self, class_name: str = "ExcelRow") -> List[object]: """ 将行数据映射为对象列表 :param class_name: 生成的类名(默认为ExcelRow) :return: 对象列表 """ if self.sheet.nrows < 1: return [] # 创建数据类 DataClass = self._create_data_class(class_name) objects = [] # 从第二行开始处理数据(跳过表头) for row_idx in range(1, self.sheet.nrows): obj = DataClass() for col_idx in range(self.sheet.ncols): cell_value = self.sheet.cell_value(row_idx, col_idx) cell_type = self.sheet.cell_type(row_idx, col_idx) # 处理特殊数据类型 if cell_type == xlrd.XL_CELL_DATE: cell_value = datetime(*xlrd.xldate_as_tuple(cell_value, self.workbook.datemode)[:6]) elif cell_type == xlrd.XL_CELL_NUMBER and cell_value.is_integer(): cell_value = int(cell_value) # 设置对象属性 attr_name = str(self.sheet.cell_value(0, col_idx)).strip() setattr(obj, attr_name, cell_value) objects.append(obj) return objects # 使用示例 if __name__ == "__main__": # 实例化映射器 mapper = ExcelMapper("data.xlsx") # 替换为实际文件路径 # 获取映射后的对象列表 data_objects = mapper.map_to_objects("Employee") # 访问对象数据 for obj in data_objects: print(f"对象属性: {vars(obj)}") # 示例: 若存在"姓名"列,可直接访问 obj.姓名 ``` ### 关键功能说明 1. **动态类创建** - 根据 Excel 表头自动生成类属性 - 支持自定义类名(默认为 `ExcelRow`) - 示例:表头为 `["姓名", "年龄"]` → 生成 `obj.姓名` 和 `obj.年龄` 属性 2. **数据类型处理** - 自动识别日期转换为 `datetime` 对象 - 整数识别:将 `3.0` 转为 `3` - 保留浮点数和小数 - 字符串自动去除首尾空格 3. **使用方法** ```python # 创建映射器 mapper = ExcelMapper("员工数据.xlsx", sheet_index=0) # 获取对象列表(指定类名为Employee) employees = mapper.map_to_objects("Employee") # 使用对象数据 for emp in employees: print(f"员工: {emp.姓名}, 年龄: {emp.年龄}, 入职时间: {emp.入职日期}") ``` ### 处理特殊情况的建议 1. **表头规范** - 确保第一行是有效的属性名 - 避免特殊字符(如空格用下划线替代) - 示例优化:`"First Name"` → 自动转为 `obj.First_Name` 2. **空值处理** - 空单元格自动设置为 `None` - 可在映射后添加数据验证: ```python for obj in data_objects: if obj.年龄 is None: obj.年龄 = 0 # 设置默认值 ``` 3. **多工作表支持** - 通过修改 `sheet_index` 参数切换工作表 ```python # 读取第二个工作表 mapper = ExcelMapper("data.xlsx", sheet_index=1) ``` ### 相关技术说明 - **xlrd 日期处理**:Excel 日期存储为浮点数,`xlrd.XL_CELL_DATE` 类型需特殊转换[^1] - **动态类创建**:使用 `type()` 函数动态创建类,比 `namedtuple` 更灵活 - **内存优化**:逐行处理数据,适合大文件操作
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值