python 读取 excel 为矩阵,跳过标题行,按列归一化

该代码段展示了一个Python脚本,用于从Excel文件中读取数据,跳过标题行并进行数据矩阵的构建。如果遇到`xlrd`不支持.xlsx文件的错误,可以通过降级`xlrd`版本为1.2.0来解决。数据矩阵在读取后可选进行归一化处理,使用了`sklearn`的`MinMaxScaler`。

如下图所示的 excel 文件,想跳过标题行,读取数据矩阵:

代码如下: 

import numpy as np
import xlrd
from sklearn import preprocessing


def excel_to_matrix(path, data_norm=True):
    table = xlrd.open_workbook(path).sheets()[0]
    row = table.nrows
    col = table.ncols
    datamatrix = np.zeros((row-1, col))
    for x in range(col):
        cols = np.array(table.col_values(x))
        datamatrix[:, x] = cols[1:]  # 不读标题行
    if data_norm:
        min_max_scaler = preprocessing.MinMaxScaler()
        datamatrix = min_max_scaler.fit_transform(datamatrix)
    return datamatrix


if __name__ == '__main__':
    path = r'.\normed_Data.xlsx'
    data = excel_to_matrix(path)
    print(np.shape(data))

如果运行过程中遇到报错信息:

xlrd.biffh.XLRDError: Excel xlsx file; not supported

是由于当前 python 中的 xlrd 版本过高导致的,只需重装低版本 xlrd 即可:

pip3 install xlrd==1.2.0

<think>我们已知用户想要使用Python读取Excel表格跳过标题和汇总。根据提供的引用,我们可以使用xlrd库来读取Excel文件,并通过控制读取范围来跳过标题和汇总。 引用[1]中展示了如何打开Excel文件并选择工作表,然后通过循环从第3开始读取跳过前两,可能是标题和一说明)。但用户的需求是跳过标题和汇总,汇总通常在最后几。 因此,我们需要: 1. 打开Excel文件并选择工作表。 2. 确定标题数(假设为1)和汇总数(假设为最后1或几)。 3. 读取数据时跳过标题(从标题之后开始)并在汇总之前停止。 我们可以这样设计: - 假设标题只有一(通常在第一),汇总在最后一(或者最后几,具体需要用户指定,这里我们假设最后一是汇总)。 - 那么我们可以读取从第1(索引0)之后开始,到最后一之前结束。 但是,用户可能希望灵活指定跳过标题数和汇总数。因此,我们可以提供两个参数:`skip_header`(跳过标题数)和`skip_footer`(跳过的汇总数)。 根据引用[1]和引用[3]的示例,我们可以这样操作: table = xlrd.open_workbook(file_path).sheets()[0] nrows = table.nrows # 有效数据:从 skip_header 开始,到 nrows - skip_footer 结束 引用[3]中有一个例子:它跳过标题(第一),然后读取剩下的所有(没有考虑汇总)。我们可以修改这个函数,增加跳过汇总的功能。 具体步骤: 1. 使用xlrd打开工作簿并获第一个工作表(或指定工作表)。 2. 获数:nrows = table.nrows 3. 确定读取的起始:start_row = skip_header (例如,跳过1标题,则start_row=1,因为索引从0开始,但注意:我们跳过数是指从顶部开始的数,所以如果跳过1,则从索引1开始?不对,索引0是第一。所以跳过1标题,我们应该从索引1开始(即第二读取,直到倒数第skip_footer之前。 4. 确定结束:end_row = nrows - skip_footer 5. 循环读取从start_row到end_row-1的(因为Python的切片是左闭右开,所以实际上我们读取的是索引为start_row到end_row-1的)。 注意:索引从0开始。 例如,假设有10数据,标题1,汇总1,则: skip_header = 1 -> 从第1(索引0)之后开始,即索引1(第二)开始。 skip_footer = 1 -> 结束索引为 10-1=9,但我们读取到9之前,即索引8(第9),因为索引9是第10(最后一)被跳过。 所以读取是索引1到8(共8),而总数10,去掉头1和尾1,正好8。 但是,在引用[3]的代码中,它使用了一个循环按读取,然后跳过标题(第一)将剩下的数据放入矩阵。我们可以修改这个函数,同时跳过标题和汇总。 下面我们写一个函数,可以指定跳过标题数和汇总数,并返回一个二维表(或numpy矩阵)的数据。 如果用户不需要跳过汇总,则skip_footer=0。 另外,我们也可以考虑使用xlrd的row_values方法按读取,然后切片。 有两种方式: 方式1:按读取,然后中间部分的。 方式2:按读取,然后对每一的数据进切片(跳过标题和汇总)。 引用[3]是按读取的,但我们可以改为按读取更直观。 我们重新设计一个函数: 步骤: 1. 打开工作簿,选择工作表。 2. 获数nrows。 3. 计算起始索引:start_row = skip_header (因为索引0是第1,所以跳过skip_header,就是从skip_header开始,即索引为skip_header的,因为skip_header数,索引0到skip_header-1被跳过) 4. 计算结束索引:end_row = nrows - skip_footer (因为最后skip_footer不要,所以读取到索引end_row-1为止) 5. 循环号从start_row到end_row-1,读取每一的数据。 注意:xlrd中读取使用table.row_values(row_index) 例如: data = [] for i in range(skip_header, nrows - skip_footer): row_data = table.row_values(i) data.append(row_data) 这样,data就是一个二维表,包含了跳过标题和汇总的数据。 如果用户希望返回numpy矩阵,可以转换为numpy数组。 下面我们写一个函数,并给出示例。 注意:如果skip_footer为0,则读取到末尾。 另外,我们也可以考虑使用xlrd的sheet_by_index或sheet_by_name来指定工作表,这里我们让用户传入工作表名称或索引。 为了灵活性,我们设计函数如下: 函数:read_excel_skip_header_footer(file_path, sheet=0, skip_header=1, skip_footer=0) 参数: file_path: Excel文件路径 sheet: 可以是工作表名称(字符串)或索引(整数),默认为0(第一个工作表) skip_header: 跳过标题数,默认为1 skip_footer: 跳过的汇总数,默认为0(不跳过) 返回:二维表,每个子表是一的数据。 如果工作表不存在,则捕获异常(如引用[1]中所示)。 代码示例: 根据引用[1]和[3]的代码,我们进整合。 注意:xlrd在读取xlsx文件时可能有问题,但新版本已经支持。另外,如果文件是xlsx格式,可能需要使用open_workbook(file_path)而不是file_contents(引用[1]中使用了base64解码,但用户没有提供base64,所以直接使用文件路径)。 我们按照普通文件路径读取。 代码: ```python import xlrd def read_excel_skip_header_footer(file_path, sheet=0, skip_header=1, skip_footer=0): # 打开工作簿 book = xlrd.open_workbook(file_path) # 根据sheet参数获工作表 if isinstance(sheet, str): try: sh = book.sheet_by_name(sheet) except xlrd.XLRDError: print(f"Sheet '{sheet}' not exists") raise else: # 整数索引 sh = book.sheet_by_index(sheet) nrows = sh.nrows # 计算实际读取范围 start_row = skip_header # 从跳过标题之后的开始(索引从0开始,所以跳过skip_header后,从第skip_header开始) end_row = nrows - skip_footer # 结束索引(不包含) data = [] for i in range(start_row, end_row): row_data = sh.row_values(i) data.append(row_data) return data ``` 使用示例: 假设Excel文件中有10数据,第一标题,最后一是汇总,则: data = read_excel_skip_header_footer('test.xlsx', skip_header=1, skip_footer=1) 将读取第2到第9(共8)。 注意:如果跳过数后没有有效(start_row>=end_row),则返回空表。 另外,如果用户需要处理数值型数据,可能需要转换,因为row_values返回的是浮点数或字符串等。但xlrd会自动转换类型,所以一般不需要额外处理。 但是,如果单元格是日期类型,则返回的是浮点数(Excel中的日期表示),需要转换。不过用户问题中没有提到日期,所以这里不考虑。 如果用户需要按归一化等操作,可以参考引用[3]使用sklearn的MinMaxScaler,但这不是当前问题的需求。 因此,我们给出上述函数即可满足用户跳过标题和汇总的需求。 另外,如果用户希望跳过的工作表是动态的,或者需要处理多个工作表,可以在函数外循环调用。 下面我们给出一个完整的示例,包括异常处理。 注意:在引用[1]中,捕获了工作表不存在的异常,并抛出了警告。我们的函数中如果工作表不存在,会捕获异常并打印信息,然后重新抛出,用户可以根据需要处理。 如果用户不想抛出异常,可以返回None,但这里我们按照引用[1]的方式抛出异常。 因此,我们使用try-except来捕获工作表不存在的异常。 现在,我们根据用户的问题,给出回答。</think>### Python读取Excel跳过标题和汇总的方法 在Python读取Excel文件时跳过标题和汇总,可以通过以下两种方法实现: #### 方法1:使用xlrd库(适合.xls文件) ```python import xlrd def read_excel_skip_rows(file_path, skip_header=1, skip_footer=1): workbook = xlrd.open_workbook(file_path) sheet = workbook.sheet_by_index(0) # 获第一个工作表 total_rows = sheet.nrows start_row = skip_header # 跳过标题 end_row = total_rows - skip_footer # 跳过汇总 data = [] for row_idx in range(start_row, end_row): row_data = sheet.row_values(row_idx) # 获当前数据 data.append(row_data) return data # 使用示例 data = read_excel_skip_rows("data.xls", skip_header=1, skip_footer=1) print(f"读取到{len(data)}有效数据") ``` #### 方法2:使用pandas库(适合.xlsx/.xls文件) ```python import pandas as pd def read_excel_skip_rows_pd(file_path, skip_header=1, skip_footer=1): # 读取跳过首尾 df = pd.read_excel( file_path, skiprows=skip_header, # 跳过标题 skipfooter=skip_footer # 跳过汇总 ) return df.values.tolist() # 转换为二维表 # 使用示例 data = read_excel_skip_rows_pd("data.xlsx", skip_header=1, skip_footer=1) print(f"读取到{len(data)}有效数据") ``` #### 关键参数说明: 1. **skip_header**:跳过标题数(默认为1) 2. **skip_footer**:跳过的汇总数(默认为1) 3. **start_row**:数据读取起始标题之后) 4. **end_row**:数据读取结束(汇总之前) #### 注意事项: 1. 号索引从0开始计算 2. 如果汇总有多,调整`skip_footer`参数值 3. 使用xlrd时注意文件格式兼容性(.xls/.xlsx)[^1] 4. 使用pandas时需要安装`openpyxl`或`xlrd`引擎支持 > 示例数据表结构: > ``` > 标题跳过) | A | B | C | > 有效数据1 | 1 | 2 | 3 | > 有效数据2 | 4 | 5 | 6 | > 汇总跳过) | 总计 | 7 | 9 | > ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值