讲师中心 微信公众号
AI工具推荐 视频效率加速

使用 Pandas 合并多 Excel 文件中的指定工作表数据

阿萱吖_9121

阿萱吖_9121

发布时间:2025-09-29 14:39:00

|

823人浏览过

|

来源于php中文网

原创

使用 Pandas 合并多 Excel 文件中的指定工作表数据

本教程旨在指导用户如何使用 Python 的 Pandas 库高效地合并来自多个 Excel 文件中指定工作表的数据。文章将详细阐述如何遍历文件目录、识别 Excel 文件、加载工作簿、筛选特定工作表并将其数据解析为 Pandas DataFrame,最终存储在一个字典中,同时会重点解决常见的 AttributeError: 'str' object has no attribute 'sheet_names' 错误。

1. 引言与挑战

在数据分析和处理过程中,我们经常需要从多个 excel 文件中提取数据并进行整合。这些 excel 文件可能位于同一目录或子目录中,并且每个文件可能包含多个工作表。我们的目标是根据特定的工作表名称筛选数据,并将其合并到一个统一的数据结构中,例如 pandas dataframe 字典,以便后续的分析。

此任务的核心挑战在于:

  • 文件遍历: 如何有效地遍历指定目录下的所有 Excel 文件。
  • 工作簿加载: 如何正确加载 Excel 文件以访问其内部结构。
  • 工作表筛选: 如何根据工作表名称条件选择性地提取数据。
  • 常见错误处理: 理解并解决在处理过程中可能遇到的 AttributeError。

2. 理解 AttributeError: 'str' object has no attribute 'sheet_names'

在处理 Excel 文件时,一个常见的错误是 AttributeError: 'str' object has no attribute 'sheet_names'。这个错误通常发生在尝试在一个字符串对象上调用 sheet_names 属性时。sheet_names 是 pandas.ExcelFile 对象的属性,用于获取工作簿中所有工作表的名称列表。

错误原因分析: 在原始错误代码中:

for sheet_name in path.sheet_names():

这里的 path 变量在循环中代表的是一个文件路径字符串(例如 'your/excel/files/path/file.xlsx'),而不是一个 pandas.ExcelFile 对象。因此,当尝试在一个字符串对象上调用 sheet_names()(即使是 sheet_names 属性,字符串也没有这个属性)时,就会引发 AttributeError。

正确做法: 必须先使用 pd.ExcelFile() 将文件路径字符串加载成一个 ExcelFile 对象,然后才能访问该对象的 sheet_names 属性。

3. 合并多 Excel 文件指定工作表数据的完整教程

以下是使用 Python 和 Pandas 实现该功能的详细步骤和代码示例。

excel-toolkit
excel-toolkit

创建、检查和编辑 Microsoft Excel 工作簿及 XLSX 文件,具备可靠的公式、日期、类型、格式、重新计算和模板保留功能...

下载

3.1 环境准备

首先,确保安装了 pandas 库。如果尚未安装,可以通过以下命令安装:

pip install pandas openpyxl xlrd

openpyxl 和 xlrd 是 Pandas 读取 .xlsx 和 .xls 文件所需的引擎。

3.2 核心代码实现

import os
import pandas as pd

def merge_excel_sheets_to_dict(base_path: str, target_sheet_names: list) -> dict:
    """
    遍历指定路径下的所有Excel文件,根据目标工作表名称筛选并合并数据。

    Args:
        base_path (str): 包含Excel文件的根目录路径。
        target_sheet_names (list): 一个字符串列表,包含需要合并的工作表名称。

    Returns:
        dict: 一个字典,键为工作表名称,值为合并后的DataFrame。
              如果同一个工作表名称在多个文件中出现,数据将追加到同一个DataFrame中。
    """

    # 初始化一个字典,用于存储每个目标工作表名称对应的DataFrame
    # 键为工作表名称,值为pd.DataFrame对象
    merged_data_frames = {sheet_name: pd.DataFrame() for sheet_name in target_sheet_names}

    print(f"开始扫描目录: {base_path}")

    # 使用 os.walk 遍历指定路径下的所有文件和子目录
    for root, dirs, files in os.walk(base_path):
        for fname in files:
            # 构建完整的文件路径
            file_path = os.path.join(root, fname)

            # 仅处理 Excel 文件 (.xlsx 或 .xls)
            if file_path.endswith(('.xlsx', '.xls')):
                print(f"\n正在处理文件: {file_path}")
                try:
                    # 将文件路径加载为 pandas.ExcelFile 对象
                    # 这是解决 AttributeError 的关键步骤
                    xls_file = pd.ExcelFile(file_path)

                    # 遍历当前 Excel 文件中的所有工作表名称
                    for sheet_name in xls_file.sheet_names:
                        # 检查当前工作表名称是否在我们的目标列表中
                        if sheet_name in target_sheet_names:
                            print(f"  发现目标工作表: '{sheet_name}'")
                            # 解析指定工作表的数据到 DataFrame
                            df = xls_file.parse(sheet_name)

                            # 将当前工作表的数据追加到对应的 merged_data_frames 字典中
                            # 如果是第一次遇到这个工作表,它会是一个空的DataFrame,直接赋值
                            # 否则,使用 pd.concat 进行追加
                            if merged_data_frames[sheet_name].empty:
                                merged_data_frames[sheet_name] = df
                            else:
                                merged_data_frames[sheet_name] = pd.concat([merged_data_frames[sheet_name], df], ignore_index=True)
                        # else:
                        #     print(f"  跳过非目标工作表: '{sheet_name}'")

                except Exception as e:
                    print(f"  处理文件 '{file_path}' 时发生错误: {e}")
                    continue # 继续处理下一个文件

    print("\n所有文件处理完毕。")
    return merged_data_frames

# --- 使用示例 ---
if __name__ == "__main__":
    # 定义你的 Excel 文件所在的路径
    # 请将 'your/excel/files/path' 替换为实际的目录路径
    excel_files_directory = 'your/excel/files/path' 

    # 定义你想要合并的工作表名称列表
    # 示例中选取 'Portfolios' 和 'SP Search Term Req'
    sheets_to_merge = ['Portfolios', 'SP Search Term Req']

    # 调用函数执行合并操作
    final_merged_data = merge_excel_sheets_to_dict(excel_files_directory, sheets_to_merge)

    # 打印合并结果的概览
    if final_merged_data:
        for sheet_name, df in final_merged_data.items():
            print(f"\n工作表 '{sheet_name}' 合并后的数据概览:")
            if not df.empty:
                print(f"  总行数: {len(df)}")
                print(df.head()) # 打印前几行数据
            else:
                print("  未找到数据或数据为空。")
    else:
        print("未找到任何符合条件的工作表数据。")

3.3 代码解析

  1. 导入必要的库: os 用于文件系统操作(遍历目录),pandas 用于数据处理。
  2. merge_excel_sheets_to_dict 函数:
    • 接收 base_path(Excel 文件根目录)和 target_sheet_names(要合并的工作表名称列表)作为参数。
    • merged_data_frames 初始化: 创建一个字典,预先为每个目标工作表名称初始化一个空的 Pandas DataFrame。这样做的好处是,即使某个工作表在某个文件中不存在,我们也能确保最终字典中包含该工作表名称的键,其值为一个空 DataFrame,便于后续处理。
    • os.walk(base_path): 这是遍历目录的关键。它会生成一个三元组 (root, dirs, files),其中 root 是当前正在遍历的目录路径,dirs 是 root 下的子目录列表,files 是 root 下的文件列表。
    • 文件路径构建与筛选: os.path.join(root, fname) 拼接出文件的完整路径。if file_path.endswith(('.xlsx', '.xls')): 确保我们只处理 Excel 文件。
    • 加载 ExcelFile 对象: xls_file = pd.ExcelFile(file_path) 是解决 AttributeError 的关键。它将 Excel 文件加载为一个 ExcelFile 对象,这个对象才拥有 sheet_names 属性。
    • 遍历工作表: for sheet_name in xls_file.sheet_names: 遍历当前 Excel 文件中的所有工作表名称。
    • 条件筛选与解析: if sheet_name in target_sheet_names: 检查当前工作表是否是我们想要合并的目标工作表。如果是,df = xls_file.parse(sheet_name) 将该工作表解析为 Pandas DataFrame。
    • 数据追加: pd.concat 用于将新解析的 DataFrame 追加到 merged_data_frames 字典中对应工作表的 DataFrame 中。ignore_index=True 在追加时会重置索引,避免索引重复。
    • 错误处理: try-except 块用于捕获在处理特定文件时可能发生的错误(例如文件损坏、权限问题等),并打印错误信息,然后继续处理下一个文件,提高程序的健壮性。
  3. 使用示例 (if __name__ == "__main__":):
    • 定义 excel_files_directory 为你的 Excel 文件实际存放的路径。
    • 定义 sheets_to_merge 为你希望合并的工作表名称列表。
    • 调用 merge_excel_sheets_to_dict 函数并打印合并结果的概览。

4. 注意事项与最佳实践

  • 路径设置: 务必将 excel_files_directory = 'your/excel/files/path' 替换为你的实际路径。建议使用绝对路径以避免潜在问题。
  • 工作表名称匹配: target_sheet_names 列表中的名称必须与 Excel 文件中的工作表名称完全匹配(包括大小写)。
  • 内存管理: 如果要合并的 Excel 文件数量巨大或每个文件中的工作表数据量非常大,可能会导致内存不足。
    • 考虑分批处理文件。
    • 如果数据允许,可以考虑在解析每个 DataFrame 后,立即将其写入数据库或 HDF5 文件,而不是全部加载到内存中。
  • 文件格式: 代码目前支持 .xlsx 和 .xls 格式。如果需要支持其他格式,需扩展 endswith 条件。
  • 错误处理: 提供的 try-except 块是一个基本的错误处理。在生产环境中,你可能需要更详细的日志记录或错误报告机制。
  • 数据清洗: 合并后的 DataFrame 可能需要进一步的数据清洗和预处理(例如处理缺失值、数据类型转换等),这取决于你的具体分析需求。
  • 合并策略: 示例代码采用的是将同名工作表的数据简单地纵向追加 (pd.concat)。如果你的需求是横向合并(例如基于某一列进行 merge 或 join),则需要调整 pd.concat 后的逻辑。

5. 总结

本教程提供了一个健壮且灵活的 Python Pandas 解决方案,用于从多个 Excel 文件中提取并合并指定工作表的数据。通过正确使用 pandas.ExcelFile 对象,我们成功解决了常见的 AttributeError。此方法不仅提高了数据处理的效率,也为后续的数据分析工作奠定了坚实的基础。通过理解其核心原理和注意事项,你可以根据自己的具体需求进一步定制和优化此解决方案。

热门AI工具

更多
蛙蛙写作

一款AI论文写作工具,主要用于超级AI智能写作助手,适合需要提升相关任务效率的用户。

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

VibeKnow
VibeKnow Hot

一款AI视频创作工具,主要用于全球首个AI知识视频创作平台,文档、文章、网页,一键生成视频,适合需要提升相关任务效率的用户。

音述AI
音述AI Hot

一款AI音频处理工具,主要用于音述AI是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

相关专题

更多
Python 时间序列分析与预测
Python 时间序列分析与预测

本专题专注讲解 Python 在时间序列数据处理与预测建模中的实战技巧,涵盖时间索引处理、周期性与趋势分解、平稳性检测、ARIMA/SARIMA 模型构建、预测误差评估,以及基于实际业务场景的时间序列项目实操,帮助学习者掌握从数据预处理到模型预测的完整时序分析能力。

320

2025.12.04

Python 数据清洗与预处理实战
Python 数据清洗与预处理实战

本专题系统讲解 Python 在数据清洗与预处理中的核心技术,包括使用 Pandas 进行缺失值处理、异常值检测、数据格式化、特征工程与数据转换,结合 NumPy 高效处理大规模数据。通过实战案例,帮助学习者掌握 如何处理混乱、不完整数据,为后续数据分析与机器学习模型训练打下坚实基础。

232

2026.01.31

Python数据分析与Pandas高级实战
Python数据分析与Pandas高级实战

本专题围绕 Python 数据分析展开,系统讲解 Pandas 的高级用法,包括数据清洗、透视表、时间序列分析以及多表合并与分组操作。通过实战案例,帮助开发者掌握高效处理与分析数据的方法,提高数据处理效率与分析能力。

411

2026.04.13

数据类型有哪几种
数据类型有哪几种

数据类型有整型、浮点型、字符型、字符串型、布尔型、数组、结构体和枚举等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2631

2023.10.31

php数据类型
php数据类型

本专题整合了php数据类型相关内容,阅读专题下面的文章了解更多详细内容。

514

2025.10.31

c语言 数据类型
c语言 数据类型

本专题整合了c语言数据类型相关内容,阅读专题下面的文章了解更多详细内容。

442

2026.02.12

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

1618

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

2424

2023.09.04

LLVM自定义Pass怎么写
LLVM自定义Pass怎么写

本专题聚焦LLVM自定义Pass开发,整理Pass类结构、run()方法、PreservedAnalyses、CMake构建、插件注册、-load-pass-plugin加载和测试用例编写流程。

80

2026.09.30

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Excel 教程
Excel 教程

共162课时 | 43.9万人学习

成为PHP架构师-自制PHP框架
成为PHP架构师-自制PHP框架

共28课时 | 3.5万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn