您当前的位置:首页 > IT编程 > python
| C语言 | Java | VB | VC | python | Android | TensorFlow | C++ | oracle | 学术与代码 | cnn卷积神经网络 | gnn | 图像修复 | Keras | 数据集 | Neo4j | 自然语言处理 | 深度学习 | 医学CAD | 医学影像 | 超参数 | pointnet | pytorch | 异常检测 | Transformers | 情感分类 | 知识图谱 |

自学教程:python 合并多个excel中同名的sheet

51自学网 2021-10-30 23:07:20
  python
这篇教程python 合并多个excel中同名的sheet写得很实用,希望能帮到您。

大家好~ 老Amy来啦!已经n久没有给大家输出关于办公自动化的文章了…为什么呢?罗列原因:

  • 太忙!(被领导“压榨”)
  • 太忙!(没有额外的精力揣测大家办公的需求)
  • 太忙!(持续吃瓜中)

然鹅,一位朋友的困惑成为了我这种“麻木状态”的终结者,他提出需求如下:

想不断尝试的老Amy,开启了思考模式:“我要怎么实现这个需求呢?”。

不用着急,首先我们来分析数据本身。

分析数据特征如下:

数据所在路径 C:/Users/logic/Desktop/mytest/file_dir

data01.xlsx 数据如下:

data02.xlsx 数据如下:

由上可得信息如下:

  • 所有 xlsx 工作簿都在同一个文件夹下
  • data01.xlsx 与 data02.xlsx 中 sheet 名相同的进行合并。也就是202001与202001合并,其它同理。

我们需要合并数据,首先需要读取到每个工作簿下每个工作表的数据,实现流程如下:

  • 获取文件夹下所有工作簿名
  • 拼接为绝对路径
  • 读取所有表格数据
  • 保存到空列表中

那要通过代码完成上面的连环操作,我们就需要使用到 python 中的内置模块 os 模块——与操作系统进行交互的模块,来获取文件夹下所有工作簿名,代码如下:

import os # 导入模块# 列出 C:/Users/logic/Desktop/mytest/file_dir 下所有文件名file_name_li = os.listdir(r"C:/Users/logic/Desktop/mytest/file_dir")file_name_li---------------------------------------------------------------------['data01.xlsx', 'data02.xlsx']

但此时,无法只通过文件名去系统中找到对应的文件,所以我们需要更准确一点儿的地址——绝对路径,所以现在我们需要拼接每个文件的绝对路径。代码如下:

# 遍历出每个文件名for file_name in file_name_li:  # 将文件夹绝对路径 与 文件名进行拼接  file_path_li = os.path.join(r"C:/Users/logic/Desktop/mytest/file_dir",file_name)  print(file_path_li)  --------------------------------------------------------------------C:/Users/logic/Desktop/mytest/file_dir/data01.xlsxC:/Users/logic/Desktop/mytest/file_dir/data02.xlsx

有了文件的绝对路径后,我们就可以来读取文件中的数据,那就要使用到法宝 pandas 了。首先大家注意,pandas 并不是 python 的内置模块,而是需要我们去安装的。然后使用 pandas 的 read_excel() 方法读取数据,但是需要注意的是,此时我们需要读取的是工作簿下的所有工作表,所以需要指定 sheet_name 为 None,否则会默认读取第一个工作表。代码如下:

# 遍历出每个文件名for file_name in file_name_li:  # 将文件夹绝对路径 与 文件名进行拼接  file_path_li = os.path.join(r"C:/Users/logic/Desktop/mytest/file_dir",file_name)  # 读取 excel 表格数据  all_data = pd.read_excel(file_path_li,sheet_name=None)  print(all_data)  --------------------------------------------------------------------OrderedDict([('202001',     车牌号 驾驶员   起始公里  截至公里  里程数   加油金额  加油公升0  鄂J0969  陈燕 186701.0 186935  234  267.07  32.411  鄂A25JL NaN    NaN    0   0   NaN   NaN2  鄂A37NK  吕扬  40283.0  40993  710  512.08  68.373  鄂A332B NaN    NaN    0   0   NaN   NaN4  鄂A3J78L  尚超    0.0   33  33   NaN   NaN5  鄂A484ZF  鲁浩  50286.0  52574 2288 1340.84 191.456  鄂A620J  袁耀  41398.0  43604 2206 1579.69 225.677  鄂A7A8Z  志勇  41560.0  42883 1323  788.48 107.578  鄂AJ37Y  刘冲    0.0   73  73   NaN   NaN9  鄂AD9251  毛义  3214.0  3349  135   NaN   NaN10 鄂AD2192  赵敏   434.0   796  362   NaN   NaN),...], ...)

从上打印出的结果(我取了第一个),会发现它的类型为 OrderedDict ,虽然组合起来好像不是很看得懂,但是分开来看,它的本质实际上是 Dict。所以实际上我们可以通过 202001 来获取对应的数据值。如:

# 遍历出每个文件名for file_name in file_name_li:  # 将文件夹绝对路径 与 文件名进行拼接  file_path_li = os.path.join(r"C:/Users/logic/Desktop/mytest/file_dir",file_name)  # 读取 excel 表格数据  all_data = pd.read_excel(file_path_li,sheet_name=None)  print(all_data["202001"])---------------------------------------------------------------------车牌号 驾驶员   起始公里  截至公里  里程数   加油金额  加油公升0  鄂J0969  陈燕 186701.0 186935  234  267.07  32.411  鄂A25JL NaN    NaN    0   0   NaN   NaN2  鄂A37NK  吕扬  40283.0  40993  710  512.08  68.373  鄂A332B NaN    NaN    0   0   NaN   NaN4  鄂A3J78L  尚超    0.0   33  33   NaN   NaN5  鄂A484ZF  鲁浩  50286.0  52574 2288 1340.84 191.456  鄂A620J  袁耀  41398.0  43604 2206 1579.69 225.677  鄂A7A8Z  志勇  41560.0  42883 1323  788.48 107.578  鄂AJ37Y  刘冲    0.0   73  73   NaN   NaN9  鄂AD9251  毛义  3214.0  3349  135   NaN   NaN10 鄂AD2192  赵敏   434.0   796  362   NaN   NaN  车牌号 驾驶员  起始公里  截至公里  里程数   加油金额  加油公升0  鄂J0039 周鹏  15512  15512   0   NaN   NaN1  鄂J0021 王林  7790  7790   0   NaN   NaN2  鄂J0022 徐涛 373505 373505   0   NaN   NaN3  鄂J0079 赵舟 431169 431169   0   NaN   NaN4  鄂J0018  郭鹰  3635  3635   0   NaN   NaN5  鄂J0808 周尊 257743 257743   0   NaN   NaN6  鄂J01X3 胡志  72000  72150  150  159.26  25.167  鄂J01X0 吴军  73031  73568  537  393.46  58.128  鄂J0F12 宋安 149017 149050  33   0.00  0.009  鄂J0F52 金煜 150617 150617   0   NaN   NaN10  鄂J0272 刘兵  58124  58305  181   0.00  0.0011  鄂J02F2 胡飞 169665 169665   0   NaN   NaN12  鄂J0292 王勇 111625 113121 1496 1081.37 156.5413  鄂J05R0 刘金  99278  99278   0   NaN   NaN

从打印结果,可以发现,我们通过 202001 可以取到两个工作簿中 202001 的数据,这是为什么呢?傻瓜,因为循环呀~所以,现在我们就想,把数据都添加到一个列表中。除此之外,我们还需要工作表名来获取数据,也就是将工作表名保存到一个集合中(以便去重)。

# 定义文件名集合all_file_name = set()# 定义数据列表all_data_li = []# 遍历出每个文件名for file_name in file_name_li:  # 将文件夹绝对路径 与 文件名进行拼接  file_path_li = os.path.join(r"C:/Users/logic/Desktop/mytest/file_dir",file_name)  # 读取 excel 表格数据  all_data = pd.read_excel(file_path_li,sheet_name=None)  # 将数据添加到数据列表中  all_data_li.append(all_data)  # 将工作表名添加到文件夹集合中  for name in all_data:    all_file_name.add(name)print(all_data_li)print(all_file_name)

有了这些宝贝之后,我们就可以来实现非常关键的步骤了,也就是取出相同名称的工作表进行拼接保存到新的工作表中。

不过仍然要思考的是,我们怎么使用 pandas 给一个工作簿中添加多个工作表呢?那就需要使用 pd.ExcelWriter了。代码如下:

# 创建工作簿writer = pd.ExcelWriter("all_data.xlsx")# 遍历每个工作表名for sheet_name in all_file_name:  data_li = []  # 遍历数据  for data in all_data_li:    # 获取同名数据并添加到data_li中    n_rows = data_li.append(data[sheet_name])  # 将同名数据进行拼接  group_data = pd.concat(data_li)  # 保存到writer工作簿中,并指定工作表名为sheet_name  group_data.to_excel(writer,sheet_name=sheet_name)# 千万莫忘记,保存工作簿writer.save()

就酱,实现完毕啦~哈哈哈哈哈

以上就是python 合并多个excel中同名的sheet的详细内容,更多关于python 合并excel中的sheet的资料请关注51zixue.net其它相关文章!


python 实现图片格式的批量转化,jpg转化为png或者png转化为jpg
浅析pandas随机排列与随机抽样
万事OK自学网:51自学网_软件自学网_CAD自学网自学excel、自学PS、自学CAD、自学C语言、自学css3实例,是一个通过网络自主学习工作技能的自学平台,网友喜欢的软件自学网站。