pandas读取excel
Pandas操作Excel
一、Pandas操作Excel的核心依赖
Pandas本身不直接实现Excel解析,需依赖第三方引擎处理不同格式:
- .xlsx格式(Excel 2007+):依赖
openpyxl库
安装:pip install pandas openpyxl - .xls格式(Excel 97-2003):依赖
xlrd库(需指定版本,新版本已弃用.xls支持)
安装:pip install pandas xlrd==1.2.0
二、Pandas读取Excel:关键参数与避坑
1. 基础读取代码
import pandas as pd
# 读取.xlsx文件(核心三要素:路径、工作表、引擎)
df = pd.read_excel(
filepath_or_buffer="test_cases.xlsx", # 文件路径(绝对/相对)
sheet_name="login", # 工作表名或索引(如0表示第一个表)
engine="openpyxl" # 显式指定引擎,避免格式识别错误
)
# 读取.xls文件
# df = pd.read_excel("old_data.xls", sheet_name=0, engine="xlrd")
2. 必知的核心参数
sheet_name:指定读取的工作表,支持名称(如"Sheet1")、索引(如0)或列表(读取多表);usecols:仅读取指定列,如usecols=["用例ID", "接口地址"];skiprows:跳过前N行(如跳过表头注释行);dtype:指定列数据类型,如dtype={"用例ID": str}避免数字ID被解析为整数。
3. 常见坑与解决方案
- 格式识别失败:报错
Excel file format cannot be determined→ 显式指定engine参数; - 文件损坏/格式不匹配:报错
File is not a zip file→ 检查文件后缀与实际格式是否一致(如不要把.xls改名为.xlsx); - 遍历数据出错:直接遍历DataFrame会输出列名 → 用
iterrows()/itertuples()遍历行数据。
三、Pandas遍历Excel数据:正确姿势
DataFrame默认迭代列名,需用以下方法读取行数据:
1. iterrows():按行迭代(含索引)
# 遍历行数据(适合测试用例读取)
for idx, row in df.iterrows():
case_id = row["用例ID"]
url = row["接口地址"]
params = eval(row["请求参数"]) # 解析JSON格式参数
print(f"执行用例{case_id}:{url}")
2. itertuples():性能更优的迭代
# 更快的遍历方式(返回命名元组)
for row in df.itertuples():
print(f"用例ID:{row.用例ID},预期结果:{row.预期结果}")
四、Pandas写入Excel:单表/多表/追加
1. 写入单个工作表
# 准备数据
data = {
"用例ID": ["login_01", "login_02"],
"接口地址": ["https://test.com/login", "https://test.com/user"],
"测试结果": ["PASS", "FAIL"]
}
result_df = pd.DataFrame(data)
# 写入.xlsx文件(index=False避免多余行索引)
result_df.to_excel(
"test_results.xlsx",
sheet_name="登录模块",
index=False,
engine="openpyxl"
)
2. 写入多个工作表
# 用ExcelWriter实现多表写入
with pd.ExcelWriter("multi_sheet_data.xlsx", engine="openpyxl") as writer:
df.to_excel(writer, sheet_name="原始用例", index=False)
result_df.to_excel(writer, sheet_name="测试结果", index=False)
3. 追加数据到已有Excel
# 追加模式(mode="a")
with pd.ExcelWriter("test_results.xlsx", mode="a", engine="openpyxl") as writer:
new_df = pd.DataFrame({"用例ID": ["login_03"], "测试结果": ["PASS"]})
new_df.to_excel(writer, sheet_name="新增用例", index=False)
浙公网安备 33010602011771号