如何使用Python借助xlrd库从Excel循环读取多列数据
基于xlrd批量读取多列Excel数据的调整方案
原代码的核心问题
- 列索引硬编码:循环读取行时,单元格列位置固定写死为
3,没有遍历多列的逻辑,因此只会固定输出指定单列的内容 - 未提取单元格实际值:直接将
sheet.cell(...)返回的xlrd Cell对象存入列表,而非单元格的实际文本/数值,后续计算、导出都会出现异常 - 格式小问题:
workbook行存在多余缩进,会触发语法报错
调整逻辑说明
xlrd的行、列索引均从0开始计数,要实现多列批量读取,核心是先定义需要读取的目标列索引集合,再在行循环中遍历这些目标列收集对应单元格的值,不需要修改整体的行循环结构,只要把固定列值替换为列列表的遍历即可。
可直接复用的实现代码
方案1:按行存储多列数据(适合数据分析场景,最常用)
最终存储的结构为二维列表:每一行对应一个子列表,子列表内按顺序存放该行所有目标列的实际值
import xlrd file_location = "dec_DB.xlsx" workbook = xlrd.open_workbook(file_location) sheet = workbook.sheet_by_name('Sheet1') # 配置需要读取的目标列索引,可根据实际需求增删 # 以下示例为读取索引为2、3、4的三列(对应日常计数的C/D/E列) target_col_list = [2, 3, 4] multi_col_data = [] for rownum in range(sheet.nrows): # 遍历当前行下的所有目标列,收集实际单元格值 row_values = [sheet.cell(rownum, col_idx).value for col_idx in target_col_list] multi_col_data.append(row_values)
- 如果需要读取连续区间的列,比如从第2列到第6列,不需要手动枚举索引,直接生成连续列表即可:
target_col_list = list(range(2, 7)) - 最终读取完成后,可直接通过
multi_col_data[row_index][col_index]定位对应单元格的数值
方案2:按列独立存储数据(适合单列批量处理的场景)
最终存储结构为字典,每个目标列对应一个独立的一维列表,方便单独调取某一列的全部值
import xlrd file_location = "dec_DB.xlsx" workbook = xlrd.open_workbook(file_location) sheet = workbook.sheet_by_name('Sheet1') target_col_list = [2, 3, 4] # 为每个目标列初始化独立的存储列表 col_storage = {col_idx: [] for col_idx in target_col_list} for rownum in range(sheet.nrows): for col_idx in target_col_list: col_storage[col_idx].append(sheet.cell(rownum, col_idx).value) # 取值示例:提取索引为2的列的全部值,直接调用 col_storage[2] 即可
进阶优化:通过列名匹配读取,无需硬记列索引
如果Excel的列位置可能发生变动,可以先读取表头行建立列名和列索引的映射关系,直接通过列名指定要读取的列,避免手动找列索引:
# 假设第0行为表头行 header_row_idx = 0 # 建立列名到列索引的映射字典 col_name_index_map = {} for col_idx in range(sheet.ncols): col_name = sheet.cell(header_row_idx, col_idx).value col_name_index_map[col_name] = col_idx # 后续直接通过列名指定需要读取的列即可,比如要读取“姓名”“年龄”两列 target_col_names = ["姓名", "年龄"] target_col_list = [col_name_index_map[col_name] for col_name in target_col_names]
常见踩坑提醒
- 若使用xlrd 2.0及以上版本读取xlsx文件时触发
xlsx file not supported报错,可选择降级到1.2.0版本,或更换为openpyxl、pandas库实现文件读取 - 读取时注意调整跳过空行、表头行的逻辑,可根据实际数据结构按需裁剪,不需要强行读取全部162行的原始内容
内容的提问来源于stack exchange,提问作者atheer
相关产品推荐
相关产品推荐

