最近给老师汇总研究生民工们收集的数据时发现数据量一大Excel就罢工了,干脆写了个脚本,只需要将字段名一致的Excel放到一个文件夹里,在脚本中输入文件夹的路径就可以了。完整代码奉上!
数据解释:文件夹中包含两个Excel文件,其中每个Excel文件又包含多个子表,每个子表的字段名称完全一致。
import xlrd
import xlsxwriter
import os
#获取文件目录
def get_catalog(path):
catlog=[]
files=os.listdir(path) #列出文件夹中的所有excel的名字
for i in files:
catlog.append('C:/Users/AtlasWong/Desktop/test/'+i) #文件路径为:文件夹路径+表的名字
return catlog
#打开一个excel工作表
def open_xls(file):
fh = xlrd.open_workbook(file)
return fh
#获取excel中所有的sheet子表
def getsheet(fh):
return fh.sheets()
#获取sheet表的个数
def getshnum(fh):
x = 0
sh = getsheet(fh)
for sheet in sh:
x += 1
return x
#获取sheet表的行数
def getnrows(fh, sheet):
table = fh.sheets()[sheet]
return table.nrows
# 读取文件内容并返回行内容
def getFilect(file, shnum):
fh = open_xls(file) #打开一个工作表
table = fh.sheets()[shnum] #通过子表的索引定位到当前子表
num = table.nrows #字表的行数
for row in range(num): #将每一行数据拼接到空表中
rdata = table.row_values(row)
datavalue.append(rdata)
return datavalue
path='C:/Users/AtlasWong/Desktop/test'
if __name__ == '__main__':
allxls = get_catalog(path)# 定义要合并的excel文件列表
datavalue = [] # 存储所有读取的结果
#读取文件
for fl in allxls:
fh = open_xls(fl)
x = getshnum(fh)
for shnum in range(x):
print("正在读取文件:"+str(fl)+"的第"+str(shnum)+"个sheet表的内容...")
rvalue = getFilect(fl, shnum)
# 定义最终合并后生成的新excel文件
endfile = 'C:/Users/AtlasWong/Desktop/test/excel3.xlsx'
final_sheet = xlsxwriter.Workbook(endfile) # 创建一个sheet工作对象
sub_sheet = final_sheet.add_worksheet() # 在final_sheet中新建一个子表
for a in range(len(rvalue)):
for b in range(len(rvalue[a])):
c = rvalue[a][b]
sub_sheet.write(a, b, c) #在相应位置写入数据
final_sheet.close()
print("文件合并完成")
正在读取文件:C:/Users/AtlasWong/Desktop/test/1.xlsx的第0个sheet表的内容...
正在读取文件:C:/Users/AtlasWong/Desktop/test/1.xlsx的第1个sheet表的内容...
正在读取文件:C:/Users/AtlasWong/Desktop/test/1.xlsx的第2个sheet表的内容...
正在读取文件:C:/Users/AtlasWong/Desktop/test/1.xlsx的第3个sheet表的内容...
正在读取文件:C:/Users/AtlasWong/Desktop/test/2.xlsx的第0个sheet表的内容...
正在读取文件:C:/Users/AtlasWong/Desktop/test/2.xlsx的第1个sheet表的内容...
文件合并完成
如果Excel中没有子表的话,其实还有种简单的做法就是将每个Excel读取为一个dataframe,然后用concat函数拼接起来再输出,这段代码更加简短一些。
import os
#获取文件目录
files=os.listdir(r'C:/Users/AtlasWong/Desktop/test')
files
df=[]
import pandas as pd
for i in files:
df.append(pd.read_excel('C:/Users/AtlasWong/Desktop/test/'+i))
#将多个df拼接在一起
res=pd.concat(df)
res.to_excel(r'C:\Users\AtlasWong\Desktop\test\result.xlsx', index=False)
Python对于编程小白来说是相当友好的了,卷不过那些熬夜加班狗,那就学习一些Python自动化办公的技术,躺着卷吧。
想了解更多Python自动化操作Excel的知识,可以戳这里https://zhuanlan.zhihu.com/p/259583430