当前位置: 首页 > news >正文

【Python自动化】 21.1 Pandas 读取 Excel 文件的完整指南

一、基础读取方法

1. 最简单的读取方式
import pandas as pd# 基本读取
df = pd.read_excel("data.xlsx")
print(df.head())
2. 指定工作表
# 读取指定工作表
df = pd.read_excel("data.xlsx", sheet_name="Sheet1")# 读取第二个工作表(索引从0开始)
df = pd.read_excel("data.xlsx", sheet_name=1)# 读取所有工作表,返回字典
all_sheets = pd.read_excel("data.xlsx", sheet_name=None)

二、常用参数详解

1. 表头和索引控制
# 跳过表头(从第3行开始读取)
df = pd.read_excel("data.xlsx", header=2)# 没有表头,自动生成列名
df = pd.read_excel("data.xlsx", header=None)# 自定义列名
df = pd.read_excel("data.xlsx", names=['ID', 'Name', 'Age'])# 指定索引列
df = pd.read_excel("data.xlsx", index_col=0)  # 第一列作为索引
2. 数据范围控制
# 只读取特定列
df = pd.read_excel("data.xlsx", usecols="A:C")  # 读取A-C列
df = pd.read_excel("data.xlsx", usecols=[0, 2, 4])  # 读取第0,2,4列
df = pd.read_excel("data.xlsx", usecols=["Name", "Age"])  # 读取指定列名# 跳过行和列
df = pd.read_excel("data.xlsx", skiprows=3)  # 跳过前3行
df = pd.read_excel("data.xlsx", skipfooter=5)  # 跳过最后5行
df = pd.read_excel("data.xlsx", skiprows=[0, 2, 4])  # 跳过指定行# 读取特定行数
df = pd.read_excel("data.xlsx", nrows=100)  # 只读取前100行
3. 数据类型处理
# 指定数据类型
dtype_dict = {"ID": str, "Age": int, "Salary": float}
df = pd.read_excel("data.xlsx", dtype=dtype_dict)# 处理缺失值
df = pd.read_excel("data.xlsx", na_values=["", "NA", "N/A", "null"])# 日期解析
df = pd.read_excel("data.xlsx", parse_dates=["BirthDate", "HireDate"])

三、高级读取技巧

1. 读取多个工作表
# 方法1:读取所有工作表
excel_file = pd.ExcelFile("data.xlsx")
sheet_names = excel_file.sheet_names# 分别读取每个工作表
for sheet in sheet_names:df = pd.read_excel("data.xlsx", sheet_name=sheet)print(f"工作表 '{sheet}' 的数据形状: {df.shape}")# 方法2:一次性读取所有工作表
all_data = {}
with pd.ExcelFile("data.xlsx") as xls:for sheet_name in xls.sheet_names:all_data[sheet_name] = pd.read_excel(xls, sheet_name)
2. 读取特定区域
# 读取特定单元格范围
df = pd.read_excel("data.xlsx", usecols="A:D", nrows=50)# 使用openpyxl引擎进行精细控制
df = pd.read_excel("data.xlsx", engine='openpyxl')

四、错误处理和验证

1. 完整的错误处理示例
import pandas as pd
import osdef read_excel_safely(file_path, **kwargs):"""安全读取Excel文件的函数"""try:# 检查文件是否存在if not os.path.exists(file_path):raise FileNotFoundError(f"文件不存在: {file_path}")# 检查文件格式if not file_path.endswith(('.xlsx', '.xls')):raise ValueError("文件格式必须是 .xlsx 或 .xls")# 读取文件df = pd.read_excel(file_path, **kwargs)# 验证数据if df.empty:print("⚠️  警告: 读取的数据为空")print(f"✅ 成功读取文件: {file_path}")print(f"📊 数据形状: {df.shape}")print(f"📝 列名: {list(df.columns)}")return dfexcept FileNotFoundError as e:print(f"❌ 文件错误: {e}")return Noneexcept PermissionError:print("❌ 权限错误: 无法读取文件,可能正在被其他程序使用")return Noneexcept Exception as e:print(f"❌ 读取错误: {e}")return None# 使用示例
df = read_excel_safely("data.xlsx",sheet_name="Sheet1",header=0,usecols=["ID", "Name", "Age"]
)
2. 文件信息检测
def get_excel_info(file_path):"""获取Excel文件信息"""try:with pd.ExcelFile(file_path) as xls:info = {"file_path": file_path,"sheet_names": xls.sheet_names,"sheet_count": len(xls.sheet_names),"file_size": f"{os.path.getsize(file_path) / 1024:.2f} KB"}# 获取每个工作表的信息for sheet in info["sheet_names"]:df_temp = pd.read_excel(xls, sheet_name=sheet, nrows=5)info[f"{sheet}_shape"] = df_temp.shapeinfo[f"{sheet}_columns"] = list(df_temp.columns)return infoexcept Exception as e:return {"error": str(e)}# 使用示例
file_info = get_excel_info("data.xlsx")
print("文件信息:", file_info)

五、实际应用示例

1. 读取并处理数据
def process_excel_data(file_path):"""读取并处理Excel数据"""# 读取数据df = pd.read_excel(file_path,sheet_name="Sales",usecols=["Date", "Product", "Quantity", "Price"],parse_dates=["Date"],na_values=["N/A", ""])# 数据清洗df = df.dropna()  # 删除空值df = df[df["Quantity"] > 0]  # 过滤无效数量# 计算总销售额df["Total"] = df["Quantity"] * df["Price"]# 数据分析summary = {"total_sales": df["Total"].sum(),"average_sale": df["Total"].mean(),"total_transactions": len(df),"unique_products": df["Product"].nunique()}return df, summary# 使用示例
data, stats = process_excel_data("sales_data.xlsx")
print("数据摘要:", stats)
print("前5行数据:")
print(data.head())
2. 批量处理多个文件
import globdef batch_process_excel_files(pattern):"""批量处理多个Excel文件"""results = {}excel_files = glob.glob(pattern)for file in excel_files:try:df = pd.read_excel(file)results[file] = {"rows": len(df),"columns": len(df.columns),"memory_usage": df.memory_usage(deep=True).sum() / 1024 / 1024  # MB}except Exception as e:results[file] = {"error": str(e)}return results# 使用示例
results = batch_process_excel_files("*.xlsx")
for file, info in results.items():print(f"{file}: {info}")

六、引擎选择和建议

1. 不同引擎的比较
# 自动选择引擎(默认)
df = pd.read_excel("data.xlsx")# 明确指定引擎
df = pd.read_excel("data.xlsx", engine='openpyxl')  # 用于 .xlsx
df = pd.read_excel("data.xlsx", engine='xlrd')      # 用于 .xls# 推荐做法:根据文件扩展名选择引擎
def read_excel_smart(file_path):if file_path.endswith('.xlsx'):return pd.read_excel(file_path, engine='openpyxl')elif file_path.endswith('.xls'):return pd.read_excel(file_path, engine='xlrd')else:raise ValueError("不支持的文件格式")
2. 性能优化建议
# 只读取需要的列
df = pd.read_excel("large_file.xlsx", usecols=["id", "name", "value"])# 分块读取大文件
chunk_size = 10000
chunks = pd.read_excel("large_file.xlsx", chunksize=chunk_size)for i, chunk in enumerate(chunks):print(f"处理第 {i+1} 块数据, 形状: {chunk.shape}")# 处理每个数据块

七、常见问题解决方案

1. 编码问题
# 处理中文或其他特殊字符
df = pd.read_excel("data.xlsx", engine='openpyxl')# 如果列名有特殊字符,可以重命名
df.columns = [col.strip().replace(' ', '_') for col in df.columns]
2. 日期格式问题
# 强制解析日期列
df = pd.read_excel("data.xlsx", parse_dates=['date_column'])# 自定义日期格式
df['date_column'] = pd.to_datetime(df['date_column'], format='%Y-%m-%d')
3. 内存优化
# 指定数据类型以减少内存使用
dtype_dict = {'id': 'int32','age': 'int8', 'price': 'float32','category': 'category'
}
df = pd.read_excel("data.xlsx", dtype=dtype_dict)

总结

Pandas 提供了强大而灵活的 Excel 文件读取功能,通过合理使用各种参数,可以处理各种复杂的数据读取需求。关键要点:

  1. 使用 pd.read_excel() 基础读取函数
  2. 掌握关键参数sheet_name, header, usecols, dtype
  3. 添加错误处理确保代码健壮性
  4. 根据文件大小选择策略:一次性读取或分块读取
  5. 优化内存使用通过指定数据类型

通过这些方法,您可以高效地从 Excel 文件中提取和处理数据。

http://www.xdnf.cn/news/1474561.html

相关文章:

  • 从挑西瓜到树回归:用生活智慧理解机器学习算法
  • 【Python】数据可视化之分布图
  • 51单片机---硬件学习(电子琴、主从应答模式、modbus模型、DS18B20传感器显示温度)
  • AI驱动的软件测试:革命性的自动化、缺陷检测与实验优化
  • Java并发机制的底层实现原理
  • 程序化广告快速上手:零基础入门第一课
  • 洛谷 P1591 阶乘数码-普及-
  • PyTorch生成式人工智能——深度分层变分自编码器(NVAE)详解与实现
  • 贪心算法应用:基因编辑靶点选择问题详解
  • 【C++】类和对象(三)
  • Git reset 回退版本
  • stunnel实现TCP双向认证加密
  • Custom SRP - Complex Maps
  • 顺丰,途虎养车,优博讯,得物,作业帮,途游游戏,三七互娱,汤臣倍健,游卡,快手26届秋招内推
  • JVM如何排查OOM
  • 01.单例模式基类模块
  • 微信小程序携带token跳转h5, h5再返回微信小程序
  • Knative Serving:ABP 应用的 scale-to-zero 与并发模型
  • 【Python 】入门:安装教程+入门语法
  • 使用 C# .NETCore 实现MongoDB
  • OpenAI新论文:Why Language Models Hallucinate
  • 【黑客技术零基础入门】2W字零基础小白黑客学习路线,知识体系(附学习路线图)
  • 【C++】C++11的可变参数模板、emplace接口、类的新功能
  • 《云原生微服务治理进阶:隐性风险根除与全链路能力构建》
  • 旧电脑改造服务器1:启动盘制作
  • Element-Plus
  • Nestjs框架: 基于权限的精细化权限控制方案与 CASL 在 Node.js 中的应用实践
  • 【Mysql-installer-community-8.0.26.0】Mysql 社区版(8.0.26.0) 在Window 系统的默认安装配置
  • Nikto 漏洞扫描工具使用指南
  • 管家婆辉煌系列软件多仓库出库操作指南