点击上方“Python爬虫与数据挖掘”,进行关注
回复“书籍”即可获赠Python从入门到进阶共10本电子书
今
日
鸡
汤
不堪玄鬓影,来对白头吟。
一、前言
大家好,我是崔艳飞。前两天给大家分享了Python自动化文章:手把手教你利用Python轻松拆分Excel为多个CSV文件,而后在Python进阶交流群里边有读者遇到一个问题,他有很多个Excel表格,他需要对这些Excel文件进行合并。
诚然,一个一个打开复制粘贴固然可行,但是该方法费时费力,还容易出错,几个文件还可以手动处理,要是几十个甚至上百个,你就抓瞎了,不过这问题对Python来说,so easy,一起来看看吧!
二、项目目标
用Python实现多Excel、多Sheet的合并处理。
三、项目准备
软件:PyCharm
需要的库:pandas, xlrd,os
四、项目分析
1)如何选择要合并的Excel文件?
利用os,获取所有要合并的Excel文件。
2)如何选择要合并的Sheet?
利用xlrd库进行Excel读取,获取要合并的Sheet名。
3)如何合并?
利用pandas库,对所有Sheet名逐一循环打开,通过concat()进行数据追加合并即可。
4)如何保存文件?
利用to_excel保存数据,得到最终合并后的目标文件。
五、项目实现
1、第一步导入需要的库
-
import pandas as pd
-
import xlrd
-
import os
2、第二步选择要合并的Excel文件
-
#要合并文件路径
-
path=
"D:/b/"
-
#获取文件夹下所有EXCEL名
-
xlsx_names = [x
for x
in os.listdir(path)
if x.endswith(
".xlsx")]
3、第三步选择要合并的Sheet
-
# 获取第一个EXCEL名
-
xlsx_names1 =
xlsx_names[0]
-
-
-
aa =
path + xlsx_names1
-
#打开第一个EXCEL
-
first_file_fh=
xlrd.open_workbook(aa)
-
# 获取SHEET名
-
first_file_sheet=
first_file_fh.sheets()
4、第四步对Sheet内容进行循环合并
-
#按SHEET名循环
-
for sheet_name
in sheet_names:
-
df =
None
-
# 按EXCEL名循环
-
for xlsx_name
in xlsx_names:
-
sheet_na = pd.ExcelFile(path + xlsx_name).sheet_names
-
if sheet_name
in sheet_na:
-
#print(sheet_name)
-
_df = pd.read_excel(path + xlsx_name, sheet_name=sheet_name,header=
None)
-
if df
is
None:
-
df = _df
-
else:
-
df = pd.concat([df, _df], ignore_index=
True)
-
else:
continue
5、第五步保存合并后的文件
-
df.to_excel(excel_writer=writer, sheet_name=sheet_name, encoding=
"utf-8",
index=False)
-
print(sheet_name +
" 保存成功!共%d个,第%d个。" % (len(sheet_names),num))
-
num +=
1
-
writer.save()
-
writer.close()
六、效果展示
1、处理前Excel数据:
2、运行进度提示:
3、合并后的结果:
七、总结
本文介绍了如何利用Python对多个Excel文件、多Sheet进行合并处理,减少了很多复制粘贴的麻烦,省时省力,还不容易出错,代码不多,循环追加有点绕,想想也就明白了,不懂的随时留言提问,大家一起学习进步。
有想法的小伙伴还可以将文章中的代码进行打包,做成一个exe可执行的小软件,包装好发给别人使用,也可以赚点小费噢,关于打包的教程这里不再赘述,欢迎前往:三个你必须要记住的Pyinstaller打包命令——利用Python实现打包exe。
八、彩蛋
下面两份代码是群内小伙伴提供了,小编也自行测试了下,亲测有效,欢迎大家积极尝试噢!
来自群友Jayson的代码:
-
# -*- coding: utf-8 -*-
-
# @Author: hebe
-
# @Date: 2020-04-18 18:31:03
-
# @Last Modified by: hebe
-
# @Last Modified time: 2020-04-18 19:40:48
-
import os
-
import glob
-
import openpyxl
-
-
-
def merge_xlsx_files(xlsx_files):
-
wb = openpyxl.load_workbook(xlsx_files[
0])
-
ws = wb.active
-
ws.title =
"merged result"
-
-
-
for filename
in xlsx_files[
1:]:
-
workbook = openpyxl.load_workbook(filename)
-
sheet = workbook.active
-
for row
in sheet.iter_rows(min_row=
1):
-
values = [cell.value
for cell
in row]
-
ws.append(values)
-
return wb
-
-
-
#path is very important here , must true.
-
def get_all_xlsx_files(path):
-
xlsx_files = glob.glob(os.path.join(
r'C:\\Users\\pdcfi\\Desktop\\',
'*.xlsx'))
-
sorted(xlsx_files, key=str.lower)
-
return xlsx_files
-
-
-
def main():
-
xlsx_files = get_all_xlsx_files(os.path.expanduser(
'~lmx'))
-
wb = merge_xlsx_files(xlsx_files)
-
wb.save(
'merged_form.xlsx')
-
-
-
if __name__ ==
'__main__':
-
main()
-
-
print(
"all excel append OK!")
来自好友刘早起的代码:
-
# -*- coding: utf-8 -*-
-
from openpyxl
import load_workbook, Workbook
-
import glob
-
-
-
path =
"C:\\Users\\pdcfi\\Desktop\\excel\\"
-
new_workbook = Workbook()
-
new_sheet = new_workbook.active
-
-
-
# 用flag变量明确新表是否已经添加了表头,只要添加过一次就无须重复再添加
-
flag =
0
-
-
-
for file
in glob.glob(path +
'/*.xlsx'):
-
workbook = load_workbook(file)
-
sheet = workbook.active
-
-
-
coloum_A = sheet[
'A']
-
row_lst = []
-
for cell
in coloum_A:
-
if cell:
-
print(cell.row)
-
row_lst.append(cell.row)
-
-
-
if
not flag:
-
header = sheet[
1]
-
header_lst = []
-
for cell
in header:
-
header_lst.append(cell.value)
-
new_sheet.append(header_lst)
-
flag =
1
-
-
-
for row
in row_lst:
-
data_lst = []
-
for cell
in sheet[row]:
-
data_lst.append(cell.value)
-
new_sheet.append(data_lst)
-
-
-
new_workbook.save(path +
'/' +
'符合筛选条件的新表.xlsx')
来自群友Engineer的代码:
-
import tkinter
as tk
-
from tkinter
import filedialog
-
import os
-
import pandas
as pd
-
import glob
-
-
-
root = tk.Tk()
-
root.withdraw()
-
-
-
# 选择文件夹位置
-
filelocation = os.path.normpath(filedialog.askdirectory(initialdir=os.getcwd()))
-
lst = []
-
-
-
# 读取文件夹下所有文件(xls和xlsx都读取)
-
for i
in glob.glob(filelocation +
"\\\\" +
"*.*"):
-
if os.path.splitext(i)[
1]
in [
".xls",
".xlsx"]:
-
lst.append(pd.read_excel(i))
-
-
-
# 保存合并后的excel文件
-
writer = pd.ExcelWriter(filedialog.asksaveasfilename(title=
"保存", initialdir=filelocation, defaultextension=
"xlsx",
-
filetypes=[(
"Excel 工作簿",
"*.xlsx"),
-
(
"Excel 97-2003 工作簿",
"*.xls")]))
-
pd.concat(lst).to_excel(writer,
'all', index=
False)
-
writer.save()
-
-
-
print(
'\n%d个文件已经合并成功!' % len(lst))
最后需要本文项目代码的小伙伴,请在公众号后台回复“合并文件”关键字进行获取,如果在运行过程中有遇到任何问题,请随时留言或者加小编好友,小编看到会帮助大家解决bug噢!
当然了,实现本文功能不仅仅限于上面提及的3种方式,使用pandas也是可以做到的,如果你还有其他方法,欢迎交个朋友一起学习交流。
小编最近建立了一个Python付费学习交流群,只需要9.99元小红包即可入群学习交流,大家的学习氛围很好,有问必答,里边“无丝竹乱耳,亦无案牍劳形”,纯交流学习之用,感兴趣的小伙伴可以加下方小编微信进群学习交流噢!
------------------- End -------------------
往期精彩文章推荐:
欢迎大家点赞,留言,转发,转载,感谢大家的相伴与支持
想加入Python学习群请在后台回复【入群】
万水千山总是情,点个【在看】行不行
/今日留言主题/
随便说一两句吧~
转载:https://blog.csdn.net/pdcfighting/article/details/114267225