Python按筛选条件读取Excel数据并迭代的问题求助及替代方案
问题修复与替代方案
一、修复openpyxl代码的问题
你的代码核心逻辑错误:当前仅将匹配筛选值的单个单元格加入结果列表,而非当整行的filter_name列匹配时提取整行所需的username和password。
问题点拆解
- 遍历所有单元格时,仅单元格值等于筛选值才添加,导致返回的列表只有单个筛选字符串,无法适配后续测试用例的参数需求
- 未针对固定的
filter_name列做判断,而是全局检查所有列
修复后的代码
from openpyxl import load_workbook class Util: @staticmethod def read_data_from_excel(file_name, sheet, filter_val): datalist = [] # data_only=True确保读取单元格实际值,而非公式 wb = load_workbook(filename=file_name, data_only=True) sh = wb[sheet] row_ct = sh.max_row # 遍历数据行(从第2行开始,跳过表头) for i in range(2, row_ct + 1): # 定位第3列(filter_name列)的值 current_filter = sh.cell(row=i, column=3).value if current_filter == filter_val: # 提取当前行的username和password username = sh.cell(row=i, column=1).value password = sh.cell(row=i, column=2).value datalist.append([username, password]) return datalist
修复说明
- 添加
@staticmethod:原方法未实例化就调用,会触发类方法参数错误 - 直接定位
filter_name列判断匹配,避免无效遍历 - 匹配时提取整行所需参数,返回符合ddt
@unpack要求的二维列表 - 启用
data_only=True,避免读取公式而非实际值
二、其他Python库实现方案
1. 使用pandas(推荐,代码简洁高效)
pandas处理Excel筛选的代码量极少,且支持大文件场景:
import pandas as pd class Util: @staticmethod def read_data_from_excel(file_name, sheet, filter_val): # 读取Excel并自动识别表头 df = pd.read_excel(file_name, sheet_name=sheet) # 筛选filter_name匹配的行 filtered_rows = df[df['filter_name'] == filter_val] # 提取所需列并转为二维列表 return filtered_rows[['username', 'password']].values.tolist()
2. 使用xlrd(适配旧版Excel)
仅支持.xls格式,或xlrd<=1.2.0版本支持.xlsx:
import xlrd class Util: @staticmethod def read_data_from_excel(file_name, sheet, filter_val): datalist = [] wb = xlrd.open_workbook(file_name) sh = wb.sheet_by_name(sheet) # 动态获取列索引,避免硬编码 header = sh.row_values(0) filter_col_idx = header.index('filter_name') user_col_idx = header.index('username') pwd_col_idx = header.index('password') # 遍历数据行(xlrd索引从0开始) for i in range(1, sh.nrows): if sh.cell_value(i, filter_col_idx) == filter_val: datalist.append([ sh.cell_value(i, user_col_idx), sh.cell_value(i, pwd_col_idx) ]) return datalist
三、验证效果
修复或替换代码后,调用Util.read_data_from_excel("./test_data.xlsx", "LoginData", "github")会返回[['sample', 'tester']],完全适配ddt的@unpack装饰器,能正确将参数传递给测试用例。
内容的提问来源于stack exchange,提问作者spectator
相关产品推荐
相关产品推荐

