python学习—合并多个Excel工作簿表格文件

系列文章目录

python学习—合并TXT文本文件
python学习—统计嵌套文件夹内的文件数量并建立索引表格
python学习—查找指定目录下的指定类型文件
python学习—年会不能停,游戏抽签抽奖
python学习—循环语句-控制流


文章目录

  • 系列文章目录
  • 功能说明
  • 1 准备工作
      • ==(知识点)== 关于 Pandas 库
  • 2 第一版代码
      • (1) 指定目录
      • (2) 获取目录下所有.xlsx文件的列表
      • (3) 初始化一个空的DataFrame用于存储所有数据
      • (4) 遍历所有Excel文件并逐个读取,然后追加到all_data中
      • (5) 将合并后的数据写入指定文件中
      • (6) 第一版完整代码
  • 3 第二版代码
      • (1) 遍历工作簿中的sheet表
      • (2) 填写工作簿 和 内部 sheet表名称
      • (3) 使用绝对路径,增强代码兼容性
      • (4) 完整代码
  • 4 后记


功能说明

同事有个需求:手里有很多人编辑的Excel工作簿,差不多有20多个,现在想把这些分开的工作簿合并为一整个工作簿,方便数据查询和使用。

我看了一下,这边表格的字段都是相同的,不同的是每行的数据有多有少,笨方法当然可以新建一个空表格,然后再依次打开每个工作簿,将内容复制粘贴到新建表格中,实现合并的效果。

既然是重复性工作,当然是使用python编程了。

本代码目标为:

  • 1 将文件夹内的所有表格(包括.xls格式 和 .xlsx格式)合并为一个表格;
  • 2 每个工作簿中可能有多个分sheet表;
  • 3 合并表格的第一列填写每个工作簿文件名称,第二列填写工作簿内的分表sheet名称。

1 准备工作

首先在D盘根目录下建立文件夹“测试”,在该文件夹内存放多个Excel表格文件,内容随意。
我新建了2个工作簿,”测试表1.xlsx“ 和 “样例表2.xlsx”,工作簿中都有分表,内容如下图:

1
数据分析需要用到强大的 Pandas 库,创建Excel表格需要用到 openpyxl库,查看自己的电脑是否安装了这2个库,可以在python终端中输入:

pip list

运行后会列出你的python环境中安装的所有库文件。
如果没有安装上述两个库,可以在python终端中使用如下代码进行安装:

pip install pandas openpyxl

我使用的python版本为3.9.0,Pandas版本 1.5.2 ,openpyxl版本 3.1.2.

(知识点) 关于 Pandas 库

——Pandas: Pandas 是一个开源的 Python 数据分析和处理库,提供了大量功能使数据分析工作更加高效便捷。以下是对 Pandas 主要特点和功能的概述:

  1. 数据结构:Pandas 两大核心数据结构是 Series(一维数组,类似于带标签的数组)和 DataFrame(二维表格型数据结构,每列可以是不同类型的值)。这两种数据结构非常适合于处理和分析表格化的数据。
  2. 数据读写:Pandas 支持多种文件格式的数据读写操作,如 CSV、Excel、SQL 数据库、JSON、HDF5 等,使得数据导入导出变得简单快捷。
  3. 数据清洗:提供强大功能用于数据清洗,包括缺失值处理、数据类型转换、数据重塑、行列选择、过滤、排序等,有助于准备数据进行进一步分析。
  4. 数据操作:支持类似 SQL 的数据操作方法,如合并(merge)、连接(join)、分组(groupby)、聚合(aggregate)、透视表(pivot table)等,便于对数据进行复杂操作。
  5. 时间序列分析:Pandas 对时间序列数据有很好的支持,可以方便地进行重采样、移位、日期时间格式转换等操作,是金融、经济等领域数据分析的理想工具。
  6. 统计分析:内置了丰富的统计功能,如计算描述性统计量(均值、中位数、标准差等)、相关性分析、协方差、线性回归等,帮助用户快速理解数据。
  7. 可视化:虽然 Pandas 本身不直接提供复杂的可视化功能,但它与 Matplotlib、Seaborn 等图形库集成紧密,可以轻松地对数据进行可视化展示。

总的来说,Pandas 是进行数据预处理、数据分析和探索性数据分析的 强大工具,广泛应用于数据科学、金融、统计学、社会科学等多个领域。

2 第一版代码

第一版本的代码,主要实现一个合并的操作,最简单的情况:工作簿中只有1个表格。

(1) 指定目录

directory = 'D:/测试'

(2) 获取目录下所有.xlsx文件的列表

Excel表格有两种后缀名, .xls 和 .xlsx,使用后缀名判定。

excel_files = [file for file in os.listdir(directory) if file.endswith('.xlsx') or file.endswith('.xls')]

(3) 初始化一个空的DataFrame用于存储所有数据

all_data = pd.DataFrame()

(4) 遍历所有Excel文件并逐个读取,然后追加到all_data中

使用pandas读取Excel文件,假设每份Excel只包含一个工作表,并且想要合并所有工作表的数据。

for file in excel_files:
    file_path = os.path.join(directory, file)   
    data = pd.read_excel(file_path)
    all_data = pd.concat([all_data, data], ignore_index=True)

知识点: pandas.concat() 方法
该函数使用pd.concat()方法将file_data数据框合并到merged_data数据框中。
ignore_index=True 参数表示合并后重新索引,保持索引的连续性。
ignore_index=False 表示保留原始的索引。

(5) 将合并后的数据写入指定文件中

//指定合并后的工作簿保存路径和名称
output_file = 'D:/测试/all_hebing.xlsx'

//将合并后的数据写入新的Excel工作簿
all_data.to_excel(output_file, index=False)

(6) 第一版完整代码

import os
import pandas as pd


directory = 'D:/测试'
excel_files = [file for file in os.listdir(directory) if file.endswith('.xlsx') or file.endswith('.xls')]
all_data = pd.DataFrame()

# 遍历所有Excel文件并逐个读取,然后追加到all_data中
for file in excel_files:
    file_path = os.path.join(directory, file)
    data = pd.read_excel(file_path)
    all_data = pd.concat([all_data, data], ignore_index=True)

output_file = 'D:/测试/all_hebing.xlsx'
all_data.to_excel(output_file, index=False)

print(f'合并完成,结果已保存至:{output_file}')

结果如下图:
3
可以看到,代码实现了基本的Excel工作表合并功能,sheet4是 "样例表2.xlsx"中的第一个表格,sheet1是”测试表1.xlsx“ 中的第一个表格。

3 第二版代码

在第一版代码的基础上,实现含有多个表格的工作簿合并,合并表格的第一列填写工作簿名称,第二列填写内部sheet名称。

在代码中添加一些数据读写的判定功能,将步骤拆分包装为函数提高运行效率。重点环节代码如下:

(1) 遍历工作簿中的sheet表

遍历工作簿,首先需要获取这个工作簿的名称,然后获取内部的sheet表名称,最后按照两级名称读取表格内容。

// 存储表格内容的空列表
sheets_data = []

// 获取工作簿的名称
xls = pd.ExcelFile(file_path)

// 获取 工作簿 内的 sheet表的名称,并读取表格内容。
for sheet_name in xls.sheet_names:
	sheet_data = xls.parse(sheet_name)

这段代码的作用是遍历 Excel文件中的所有工作表,并解析每个工作表的数据。
xls.sheet_names 返回一个包含所有工作表名称的列表。
xls.parse(sheet_name) 根据给定的工作表名称,解析该工作表的数据并返回。

(2) 填写工作簿 和 内部 sheet表名称

excel表格属于二维表格型数据结构,定义列的位置、名称、内容。

	sheet_data.insert(0, '文件名称', file_path.name)
	sheet_data.insert(1, '内部表名称', sheet_name)
	
	// 将 insert 的内容,append 添加入 保存表格内容的 列表中。
	sheets_data.append(sheet_data)

该函数用于在名为sheet_data的表格的第0列,列名为’文件名称’,并将其赋值为file_path.name,即文件路径中的工作簿文件名部分;
表格的第1列,列名为’内部表名称’,并将其赋值为sheet_name,即工作簿文件名部分;

(3) 使用绝对路径,增强代码兼容性

在代码的路径设置中,使用 .resolve() 方法将该路径解析为一个绝对路径.

file_path = Path(file_path).resolve()

具体来说,它首先使用Path(file_path)创建一个Path对象,然后使用 .resolve() 方法将该路径解析为一个绝对路径。如果该路径是一个符号链接,则会解析为符号链接所指向的目标路径。如果路径不存在,则会抛出 FileNotFoundError 异常。

该函数的作用是确保后续操作使用的路径是绝对路径,避免了相对路径带来的问题,如路径解析错误、文件访问错误等。

(4) 完整代码

完整代码如下:

import os
import pandas as pd
from pathlib import Path


# 读取Excel文件的所有工作表,并为每个工作表的数据添加文件名及工作表名称作为前两列
def read_excel_sheets(file_path):
    try:
        # 使用pathlib的绝对路径确保兼容性
        file_path = Path(file_path).resolve()
        xls = pd.ExcelFile(file_path)
        sheets_data = []
        for sheet_name in xls.sheet_names:
            sheet_data = xls.parse(sheet_name)
            # 添加文件名和工作表名
            sheet_data.insert(0, '文件名称', file_path.name)
            sheet_data.insert(1, '内部表名称', sheet_name)
            sheets_data.append(sheet_data)
        return pd.concat(sheets_data, ignore_index=True)
    except FileNotFoundError:
        print(f"文件 {file_path} 不存在。")
        return pd.DataFrame()
    except PermissionError:
        print(f"没有权限读取文件 {file_path}。")
        return pd.DataFrame()
    except Exception as e:
        print(f"读取文件 {file_path} 时发生未知错误: {e}")
        return pd.DataFrame()


# 合并Excel文件,将每个文件的所有工作表合并为一个DataFrame,并保存到输出文件中。
def merge_excel_files_with_filenames(directory, output_file):
    directory_path = Path(directory).resolve()

    if not directory_path.exists() or not os.access(directory_path, os.R_OK):
        print(f"无法访问目录 {directory_path},请检查权限和路径。")
        return

    excel_files = list(directory_path.glob('*.xls*'))

    if not excel_files:
        print(f"在目录 {directory_path} 中未找到任何 .xls 或 .xlsx 文件。")
        return

    merged_data = pd.DataFrame()

    for file_path in excel_files:
        file_data = read_excel_sheets(file_path)
        merged_data = pd.concat([merged_data, file_data], ignore_index=True)

    output_dir = Path(output_file).parent.resolve()
    if not output_dir.exists() or not os.access(output_dir, os.W_OK):
        print(f"无法写入输出文件 {output_file} 的目录,请检查权限和路径。")
        return

    merged_data.to_excel(output_file, index=False)
    print(f"合并完成,结果已保存至:{output_file}。")


# 调用合并函数,使用pathlib.path对象以增强代码的清晰度和跨平台能力
if __name__ == '__main__':
    path = Path(r'D:\测试').resolve()
    over_name = 'all_合并总表.xlsx'

    over_path = Path(os.path.join(path, over_name)).resolve()
    merge_excel_files_with_filenames(path, over_path)

再次看一下合并后的Excel工作簿,如下图:
4

4 后记

通过以上代码,可以实现多个Excel工作簿的合并工作,支持中文 。

案例中每个工作簿的结构和字段名称都是一致的,当遇到字段结构不一致的时刻,代码同样可以实现合并功能。
区别在于:
相同字段的内容会存储在相同字段这一列下,而不同的字段名在合并时会增加列数,用于存放不同字段下面的内容,即合并的结果是保留了每个工作簿中的字段名称,保证所有数据的完整性。

合并后的工作表,不存在 “合并单元格”,即源工作簿中的 那些 合并单元格,将被拆分。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/703701.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Windows下基于Frida查看内存基址和修改寄存器

使用Frida能够方便地获取到DLL基址,还能修改寄存器值。首先要通过任务管理器获得进程的PID,然后写Python脚本把Frida附加到这个PID进程,根据IDA分析出来的函数地址,HOOK到目标函数,修改寄存器的值,最终实现…

vue2插槽

本节目标 默认插槽后备内容具名插槽作用域插槽案例-商品列表 默认插槽 让组件内部的一些结构 支持自定义 步骤 组件内需要定制的结构, 使用<slot></slot>占位 使用组件时, 传入结构替换slot的位置 后备内容 封装组件时, 可以为预留的<slot>插槽提供默认内…

3d模型交易的哪个网站好?

推荐一个国内的优秀专为3D模型交易服务的网站&#xff1a;老子云模型服务平台。 老子云3D可视化与模型优化服务平台https://www.laozicloud.com/ 老子云是以AMRT核心自主引擎构建的一家3D全栈技术服务平台&#xff0c;集合3D模型云处理、模型交易、模型应用、开发者服务、3D技…

vue+java实现简易AI问答组件(基于百度文心大模型)

一、需求 公司想要在页面中加入AI智能对话功能&#xff0c;故查找免费gpt接口&#xff0c;最终决定百度千帆大模型&#xff08;进入官网、官方文档中心&#xff09;&#xff1b; 二、主要功能列举 AI智能对话&#xff1b;记录上下文回答环境&#xff1b;折叠/展开窗口&#…

【SpringBoot项目常见细化错误】(保姆级教程)Result Maps collection already contains value for

SpringBoot项目常见错误 1.当Mybatis报错 Result Maps collection already contains value for一、重复点击Mybatis-Generator导致配置文件重复生成XML二、正确配置Yml仔细检查有没有多了或者少了一个空格三、spring boot mybatis四、应该用resultMap来接收返回值&#xff0c;…

linuxcentos将本地库JAR/arr批量导入到Nexus3.x

背景 我们现在要搞一个私服maven来管理对应的依赖包&#xff0c;需要上传包。用nexus只能单个文件搞&#xff0c;批量导入不行&#xff0c;而且还要单独配置groupID什么的。不多BB,上教程 建脚本 vi mavenimport.sh内容是这个 #!/bin/bash # copy and run this script to t…

图像到3D模型的革命性转换

在数字艺术、虚拟现实和增强现实等领域,从二维图像生成三维模型一直是一个挑战。然而,随着技术的不断进步,我们迎来了一种全新的解决方案,它能够从单张正交RGB图像中快速、高效地生成具有极高保真纹理和精细几何细节的3D网格模型。 1、定位与意义: 该解决方案是一种前沿…

ubuntu18.04 配置 mid360并测试fast_lio

1.在买到Mid360之后&#xff0c;我们可以看到mid360延伸出来了三组线。 第一组线是电源线&#xff0c;包含了红色线正极&#xff0c;和黑色线负极。一般可以用来接9-27v的电源&#xff0c;推荐接12v的电源转换器&#xff0c;或者接14.4v的电源转换器。 第二组线是信号线&#x…

项目五串行通信系统 任务5-3温度信息上传

任务描述&#xff1a;DS18B20测量温度&#xff0c;单片机采集温度数据转换显示代码&#xff0c;并通过串行口发送到上位机显示。 底层文件&#xff1a; /********************************************* ds18b20底层函数:能完成一次温度数据读取 ***************************…

(亲测有效)推荐2024最新的免费漫画软件app,无广告,聚合全网资源!

朋友们&#xff0c;阿星又来啦&#xff01;今天&#xff0c;我要给你们带来一些低调但超级实用的APP推荐&#xff0c;让你们追书看漫画&#xff0c;从此不再书荒&#xff01; 追书大全&#xff1a; 这个APP&#xff0c;简直是书迷的救星&#xff01;不用花一分钱&#xff0c;…

【全篇】Python从零基础到入门

文章目录 第一章 基础语法1.字面量2.注释3.变量4.数据类型5.数据类型转换6.标识符7.运算符8.字符串拓展1.字符串的三种定义方式2.字符串拼接&#xff08;不用&#xff09;3.字符串格式化&#xff08;了解&#xff09;4.格式化的精度控制5.字符串格式化2&#xff08;常用&#x…

从sub-VP SDE形式推导出扰动核(高斯分布)的均值和方差【论文精读】

从sub-VP SDE形式推导出扰动核&#xff08;高斯分布&#xff09;的均值和方差【论文精读】 讲解视频 B站视频&#xff1a;sub-VP SDE形式推导出扰动核&#xff08;高斯分布&#xff09;的均值和方差 讲解目录 &#xff08;0&#xff09;sub-VP SDE形式由来&#xff1a;有良…

14、modbus poll 使用教程小记1

开发平台&#xff1a;Win10 64位 Modbus Slave版本&#xff1a;64位 7.0.0 Modbus Poll版本&#xff1a;64位 7.2.2 因为项目中经常会用到modbus协议&#xff0c;所以就避免不了的要使用modbus测试工具&#xff0c;Modbus Slave/Poll无疑是众多测试工具中应用最广泛的。 文章目…

0602 差分式放大电路

差分式放大电路 差分放大电路的基本概念直接耦合放大电路中的零点漂移 6.2.1 差分式放大的基本概念 6.2.2 直接耦合放大电路中的零点漂移 6.2.3 BJT射极耦合差分式放大电路 差分放大电路的基本概念 直接耦合放大电路中的零点漂移

WebSocket 快速入门 与 应用

WebSocket 是一种在 Web 应用程序中实现实时、双向通信的技术。它允许客户端和服务器之间建立持久性的连接&#xff0c;以便可以在两者之间双向传输数据。 以下是 WebSocket 的一些关键特点和工作原理&#xff1a; 0.特点&#xff1a; 双向通信&#xff1a;WebSocket 允许服务…

MySQL密码自动过期配置

目录 一、密码自动过期 1、临时 2、永久 3、查看 4、账号设置 一、密码自动过期 登录数据库查看是否生效 mysql -u root -p #查看数据库账号状态 select user,host,password_expired,password_lifetime,password_last_changed,account_locked from mysql.user; 1、passwo…

【博士每天一篇文献-算法】Progressive Neural Networks

阅读时间&#xff1a;2023-12-12 1 介绍 年份&#xff1a;2016 作者&#xff1a;Andrei A. Rusu,Neil Rabinowitz,Guillaume Desjardins,DeepMind 研究科学家,也都是EWC(Overcoming catastrophic forgetting in neural networks)算法的共同作者。 期刊&#xff1a; 未录用&am…

2024-2025最新软考系统架构设计师的复习资料教材,解决如何快速高效通过该考试,试题的重点和难点在哪里?案例分析题和论文题的要点和踩坑点分析

目录 引言考试概述 考试结构考试内容 复习策略 制定复习计划学习资源 知识点详解 系统架构基础设计原则与模式系统分析与设计软件开发过程项目管理系统集成性能与优化安全性设计新兴技术 试题解析 选择题案例分析题论文题 重点与难点分析模拟试题与答案参考资料总结 引言 系…

transformers 阅读:BERT 模型

前言 想深入理解 BERT 模型&#xff0c;在阅读 transformers 库同时记录一下。 笔者小白&#xff0c;错误的地方请不吝指出。 Embedding 为了使 BERT 能处理大量下游任务&#xff0c;它的输入可以明确表示单一句子或句子对&#xff0c;例如<问题&#xff0c;答案>。 …

RK3568笔记三十一:ekho 6.3 文本转语音移植

若该文为原创文章&#xff0c;转载请注明原文出处。 移植的目的是在在OCR识别基础上增加语音播放&#xff0c;把识别到的文字直接转TTS播报出来&#xff0c;形成类似点读机的功能。 1、下载文件 libsndfile-1.0.28.tar.gz ekho-6.3.tar.xz 2、解压 tar zxvf libsndfile-1.0…