You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 14:54:24