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 pddirectory = '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},请检查权限和路径。")returnexcel_files = list(directory_path.glob('*.xls*'))if not excel_files:print(f"在目录 {directory_path} 中未找到任何 .xls 或 .xlsx 文件。")returnmerged_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} 的目录,请检查权限和路径。")returnmerged_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工作簿的合并工作,支持中文 。

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

服务器数据恢复—EMC Isilon存储中被误删的虚拟机数据恢复案例

服务器存储数据恢复环境: EMC Isilon S200集群存储,共三个节点,每节点配置12块SATA硬盘。 服务器存储故障: 工作人员误操作删除虚拟机,虚拟机中数据包括数据库、MP4、AS、TS类型的视频文件等。需要恢复数据的虚拟机通…

芯片环氧胶可以提供一定的耐盐雾耐腐蚀效果!

芯片环氧胶(或称为环氧树脂胶)在电子封装和保护应用中确实能提供一定的耐盐雾和耐腐蚀效果。 环氧树脂因为其出色的粘接性能、机械强度以及良好的化学稳定性,被广泛用于电子封装领域,尤其是芯片固定和保护。在面对盐雾腐蚀或恶劣…

使用RV1126交叉编译工具链交叉编译opencv,c++代码直接调用VideoCapture 读取摄像头数据

使用RV1126交叉编译工具链交叉编译opencv,rv1126直接调用VideoCapture 读取摄像头数据 前言环境一、ubantu安装二、交叉编译工具安装三、cmake升级四、ffmpeg安装五、opencv安装六、c代码测试(上板运行) 前言 交叉编译是一种将软件在操作系统…

关于docker无法正常下载镜像的问题

文章目录 之前还可以正常下载镜像,但是一段时间之后就无法下载了,猜测可能是政治原因,无法连接到国外服务器,所以我设置了阿里云的镜像加速器。 配置方法如下: 前往阿里云(https://help.aliyun.com/zh/acr/…

ATA-3040C功率放大器的正确使用方法

功率放大器是一种用于增强电信号功率的重要设备。正确使用功率放大器可以确保信号的稳定放大,并避免设备损坏。下面将介绍功率放大器的正确使用方法。 确定输入信号的功率范围:在使用功率放大器之前,需要确定输入信号的功率范围。过大的输入功…

Python 最强的5个高级函数,你会几个?

Python是一门灵活而强大的编程语言,具有丰富的内置函数和库。今天,我们将深入探讨五个非常有用的Python高级函数。这些函数不仅能够简化代码,还能提高代码的可读性和可维护性。 首先,了解下什么是高级函数? 高级函数…

【Unity】如何做一个很平滑的行人动画,且可以根据行人速度动态调整动画速度?

首先我们定一下不同速度对应的行人动作状态,设计为四种状态: 静止站立Stand:0~maxStandSpeed走路Walk:minWalkSpeed~maxWalkSpeed慢跑Jog:minJogSpeed~maxJogSpeed快跑Run:大于MinRunSpeed 我们可以使用A…

FISCO BCOS x GitLink,为国产开源技术生态注入新活力

作为中国领先的区块链底层平台之一,FISCO BCOS 自成立以来始终致力于推动国产开源区块链技术的应用和普及。近期,FISCO BCOS 将开源代码托管到CCF官方代码托管平台 GitLink (确实开源),为国产开源技术生态注入新活力。…

刚实习的大学生如何避免招聘骗局?

大学生在求职过程中,常常成为招聘骗局的受害者。为了避免这种情况,大学生需要提高警惕,采取一系列措施来防范招聘骗局。以下是一些建议: 首先,大学生应当保持警惕,不轻信招聘信息。在求职时,务…

使用 Elasticsearch 设计大规模向量搜索

作者:Jim Ferenczi 第 1 部分:高保真密集向量搜索 简介 在设计向量搜索体验时,可用选项的数量之多可能会让人感到不知所措。最初,管理少量向量很简单,但随着应用程序的扩展,这很快就会成为瓶颈。 在本系列…

ip地址公和内有什么区别

在数字化世界中,IP地址扮演着至关重要的角色。它不仅是网络设备的身份标识,更是信息传输的桥梁。然而,并非所有IP地址都拥有相同的属性和功能。公有IP地址和私有IP地址,作为IP地址的两大类别,它们存在着显著的差异。虎…

成都百洲文化传媒有限公司电商服务的领航者

在当今数字化浪潮席卷全球的时代,电商行业以其独特的魅力和无穷的潜力,正成为推动经济发展的重要引擎。在这一领域,成都百洲文化传媒有限公司以其专业的电商服务和创新的营销理念,成为了行业的佼佼者,引领着电商服务的…

芯片后端对于芯片设计公司的重要性

在芯片设计流程中,后端设计是一个至关重要的环节,它直接关系到芯片从设计到实际生产的转化,以及最终产品的性能、可靠性、成本和上市时间。 以下是为什么芯片后端非常重要的几个关键原因: 物理实现:后端设计是芯片从逻…

CAP理论

CAP理论 在分布式系统的世界中,CAP理论是一个绕不开的话题。CAP,即Consistency(一致性)、Availability(可用性)和Partition tolerance(分区容错性),这三个属性在分布式系…

Vxe UI vxe-table custom 实现自定义列服务端保存,服务端恢复状态,实现用户个性化列信息保存

Vxe UI vue vxe-table custom 实现自定义列服务端保存,服务端恢复状态,实现用户个性化列信息保存 支持将自定义列状态信息,列宽、冻结列、列排序、列显示隐藏 等状态信息保存到本地或服务端 代码 实现自定义列状态保存功能,只需…

在气膜建筑中运动,我们会感觉到不舒服吗—轻空间

气膜建筑是一种以膜材为主要结构,通过空气压力支撑的新型建筑形式,广泛应用于体育场馆、游泳馆和多功能运动场等领域。然而,人们常常担心在这种建筑中运动是否会感到不适。本文将探讨气膜建筑中运动的舒适度问题,并结合相关的技术…

GaN VCSEL:工艺革新引领精准波长控制新纪元

日本工程师们凭借精湛的技艺,开创了一种革命性的生产工艺,让VCSEL的制造达到了前所未有的高效与精准。这一成果由名城大学与国家先进工业科学技术研究所的精英们联手铸就,将氮化镓基VCSELs的商业化进程推向了新的高峰。它们将有望成为自适应前…

Spring Cloud 之 GateWay

前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家:https://www.captainbed.cn/z ChatGPT体验地址 文章目录 前言前言1、通过API网关访问服务2、Spring Cloud GateWay 最主要的功能就是路由…

Java中json字符串与json对象

1、json本质 json是一种数据交换格式。 常说的json格式的字符串 > 发送和接收时都只是一个字符串,它遵循json这种格式。 2、前后端交互传输的json是什么? 前后端交互传输的json都是json字符串 比如: 2.1响应过程:后端响应…

JVM的几种常见垃圾回收算法

引言: Java Virtual Machine(JVM)作为Java程序运行的核心,其垃圾回收(Garbage Collection, GC)机制在内存管理中起着至关重要的作用。垃圾回收算法是JVM性能优化的重要方面。本文将详细介绍几种常见的垃圾回…