900字范文,内容丰富有趣,生活中的好帮手!
900字范文 > 利用 Python 进行多 Sheet 表合并 多工作簿合并 一表按列拆分

利用 Python 进行多 Sheet 表合并 多工作簿合并 一表按列拆分

时间:2019-09-14 12:18:05

相关推荐

利用 Python 进行多 Sheet 表合并 多工作簿合并 一表按列拆分

作者:黄伟来源:杰哥的IT之旅(ID:Jake_Internet)转载请联系授权(WeChat ID:Hc26)

一、相关知识点讲解1、需要使用的相关库

1importnumpyasnp2importpandasaspd3importos

2、os.walk(pwd)

举例如下① 先来看看"G:\a"文件夹下有哪些东西。

② 代码操作如下:

1pwd="G:\\a"2print(os.walk(pwd))3foriinos.walk(pwd):4print(i)5forpath,dirs,filesinos.walk(pwd):6print(files)

③ 结果如下:

1<generatorobjectwalkat0x0000029BB5AEAB88>2("G:\\a",[],["aa.txt","bb.xlsx","cc.txt","dd.docx"])3["aa.txt","bb.xlsx","cc.txt","dd.docx"]

3、os.path.join(path1,path2…)

作用:将多个路径组合后返回

举例如下

1path1="G:\\a"2path2="aa.txt"3print(os.path.join(path1,path2))

结果如下:

1G:\a\aa.txt

4、案例解析

举例如下:

1pwd="G:\\a"2file_path_list=[]3forpath,dirs,filesinos.walk(pwd):4forfileinfiles:5file_path_list.append(os.path.join(pwd,file))6print(file_path_list)

结果如下:

1["G:\\a\\aa.txt","G:\\a\\bb.xlsx","G:\\a\\cc.txt","G:\\a\\dd.docx"]

5、怎么在一个列表中存放多个DataFrame数据。

1#先使用如下代码创建两个DataFrame数据源。2importnumpyasnp3xx=np.arange(15).reshape(5,3)4yy=np.arange(1,16).reshape(5,3)5xx=pd.DataFrame(xx,columns=["语文","数学","外语"])6yy=pd.DataFrame(yy,columns=["语文","数学","外语"])7print(xx)8print(yy)

结果如下:

怎么讲上述两个DataFrame拼接在一起?

1concat_list=[] 2concat_list.append(xx) 3concat_list.append(yy) 4# pd.concat(list)中【默认axis=0】默认的是数据的纵向合并。 5# pd.concat(list)括号中传入的是一个DataFrame列表。 6# ignore_list=True表示忽略原有索引,重新生成一组新的索引。 7z=pd.concat(concat_list,ignore_list=True) 8print(z) 910#或者直接可以写成z=pd.concat([xx,yy],ignore_list=True)

结果如下:

二、多工作簿合并(一)1、将多个Excel合并到一个Excel中(每个Excel中只有一个sheet表)

操作如下:

1importpandasaspd 2importos 3pwd="G:\\b" 4df_list=[] 5forpath,dirs,filesinos.walk(pwd): 6forfileinfiles: 7file_path=os.path.join(path,file) 8df=pd.read_excel(file_path) 9df_list.append(df)10result=pd.concat(df_list)11print(result)12result.to_excel("G:\\b\\result.xlsx",index=False)

结果如下:

三、多工作簿合并(二)1、相关知识点讲解

xlsxwrite的用法

11)创建一个"工作簿",此时里面会默认生成一个名叫"Sheet1"的Sheet表。 2importxlsxwriter 3#这一步相当于创建了一个新的"工作簿"; 4#"demo.xlsx"文件不存在,表示新建"工作簿"; 5#"demo.xlsx"文件存在,表示新建"工作簿"覆盖原有的"工作簿"; 6workbook=xlsxwriter.Workbook("demo.xlsx") 7#close是将"工作簿"保存关闭,这一步必须有。否则创建的文件无法显示出来。 8workbook.close() 92)创建一个"工作簿"并添加一个"工作表",工作表命名为"销量"。10importxlsxwriter11workbook=xlsxwriter.Workbook("cc.xlsx")12worksheet=workbook.add_worksheet("销售量")13workbook.close()

结果如下:

13)给"销售量"工作表创建一个表头,向其中插入一条数据。 2importxlsxwriter 3#创建一个名为【demo.xlsx】工作簿; 4workbook=xlsxwriter.Workbook("demo.xlsx") 5#创建一个名为【销售量】工作表; 6worksheet=workbook.add_worksheet("销售量") 7#使用write_row方法,为【销售量】工作表,添加一个表头; 8headings=["产品","销量","单价"] 9worksheet.write_row("A1",headings)10#使用write方法,在【销售量】工作表中插入一条数据;11# write语法格式:worksheet.write(行,列,数据)12>,500,8.9]13foriinrange(len(headings)):14worksheet.write(1,i,data[i])15workbook.close()

结果如下:

其他用法可以参考:/brightbrother/p/8671077.html

xlrd的用法

11)打开某一个存在的excel文件,返回给我们"xlrd.book.Book"工作簿对象; 2#这里所说的"打开"并不是实际意义上的打开,只是将该表加载到内存中打开。 3#我们并看不到"打开的这个效果" 4#以打开上述创建的"test.xlsx"文件为例; 5importxlrd 6file=r"G:\Jupyter\test.xlsx" 7xlrd.open_workbook(file) 8#结果如下: 9<xlrd.book.Bookat0x29bb8e4eda0>10112)sheet_names():获取所有的sheet表表名,假如有多个sheet表,返回一个列表;12importxlrd13file=r"G:\Jupyter\test.xlsx"14fh=xlrd.open_workbook(file)15fh.sheet_names()16#结果如下:17["销售量","销售量"]18193)sheets()方法:返回的是sheet表的对象列表。20#返回sheet表的对象列表21fh.sheets()22#结果如下:23[<xlrd.sheet.Sheetat0x29bb8f07a90>,<xlrd.sheet.Sheetat0x29bb8ef1390>]2425#可以利用索引,获取每一个sheet表的对象26fh.sheets()[0]27结果是:<xlrd.sheet.Sheet at 0x29bb8f07a90>28fh.sheets()[1]29结果是:<xlrd.sheet.Sheet at 0x29bb8ef1390>30314)返回每一个sheet表的行数(nrows)和列数(ncols);32#我们可以利用上述创建的sheet表对象,对每一个sheet表进行操作;33fh.sheets()[0].nrows#结果是:434fh.sheets()[0].ncols#结果是:335365)row_values(行数):获取每一个sheet表中每一行的数据;37sheet1=fh.sheets()[0]38forrowinrange(fh.sheets()[0].nrows):39value=sheet1.row_values(row)40print(value)

结果如下:

16)col_values(列数):获取每一个sheet表中每一列的数据;2sheet1=fh.sheets()[0]3forcolinrange(fh.sheets()[0].ncols):4value=sheet1.col_values(col)5print(value)

结果如下:

2、将多个Excel合并到一个Excel中(每个Excel中不只一个sheet表)

1importxlrd 2importxlsxwriter 3importos 4 5#打开一个Excel文件,创建一个工作簿对象 6defopen_xlsx(file): 7fh=xlrd.open_workbook(file) 8returnfh 910#获取sheet表的个数11defget_sheet_num(fh):12x=len(fh.sheets())13returnx1415#读取文件内容并返回行内容16defget_file_content(file,shnum):17fh=open_xlsx(file)18table=fh.sheets()[shnum]19num=table.nrows20forrowinrange(num):21r>22datavalue.append(rdata)23returndatavalue2425defget_allxls(pwd):26allxls=[]27forpath,dirs,filesinos.walk(pwd):28forfileinfiles:29allxls.append(os.path.join(path,file))30returnallxls3132#存储所有读取的结果33datavalue=[]34pwd="G:\\d"35forflinget_allxls(pwd):36fh=open_xlsx(fl)37x=get_sheet_num(fh)38forshnuminrange(x):39print("正在读取文件:"+str(fl)+"的第"+str(shnum)+"个sheet表的内容...")40rvalue=get_file_content(fl,shnum)4142#定义最终合并后生成的新文件43endfile="G:\\d\\concat.xlsx"44wb1=xlsxwriter.Workbook(endfile)45#创建一个sheet工作对象46ws=wb1.add_worksheet()47forainrange(len(rvalue)):48forbinrange(len(rvalue[a])):49c=rvalue[a][b]50ws.write(a,b,c)51wb1.close()52print("文件合并完成")

【将上述代码封装后如下】

1importxlrd 2importxlsxwriter 3importos 4 5classXlrd(): 6def__init__(self,pwd): 7self.datavalue=[] 8self.pwd=pwd 910#打开一个Excel文件,创建一个工作簿对象;11defopen_xlsx(self,fl):12fh=xlrd.open_workbook(fl)13returnfh1415#获取sheet表的个数;16defget_sheet_num(self,fh):17x=len(fh.sheets())18returnx1920#读取不同工作簿中每一个sheet中的内容,并返回每行内容组成的列表;21defget_file_content(self,file,shnum):22fh=self.open_xlsx(file)23table=fh.sheets()[shnum]24num=table.nrows25forrowinrange(num):26rdata=table.row_values(row)27#因为每一个sheet表都有一个表头;28#这里的判断语句,把这个表头去除掉;29#然后在最后写入数据的,添加上一个表头,即可;30ifrdata==["姓名","性别","年龄","家庭住址"]:31pass32else:33self.datavalue.append(rdata)34returnself.datavalue3536#获取xlsx文件的全路径;37defget_allxls(self):38allxls=[]39forpath,dirs,filesinos.walk(self.pwd):40forfileinfiles:41allxls.append(os.path.join(path,file))42returnallxls4344#返回不同工作簿中,所有的sheet表的内容列表;45defreturn_rvalue(self):46forflinself.get_allxls():47fh=self.open_xlsx(fl)48x=self.get_sheet_num(fh)49forshnuminrange(x):50print("正在读取文件:"+str(fl)+"的第"+str(shnum)+"个sheet表的内容...")51rvalue=self.get_file_content(fl,shnum)52returnrvalue5354classXlsxwriter():55def__init__(self,endfile,rvalue):56self.endfile=endfile57self.rvalue=rvalue5859defsave_data(self):60wb1=xlsxwriter.Workbook(endfile)61#创建一个sheet工作对象;62ws=wb1.add_worksheet("一年级(7)班")63#给文件添加表头;64ws=wb1.add_worksheet("销售量")65headings=["姓名","性别","年龄","家庭住址"]66forainrange(len(self.rvalue)):67forbinrange(len(self.rvalue[a])):68c=self.rvalue[a][b]69#因为给文件添加了表头,因此,数据从下一行开始写入;70ws.write(a+1,b,c)71wb1.close()72print("文件合并完成")7374pwd="G:\\d"75xl=Xlrd(pwd)76rvalue=xl.return_rvalue()77endfile="G:\\d\\concat.xlsx"78write=Xlsxwriter(endfile,rvalue)79write.save_data();

结果如下:

四、一个工作簿多sheet表合并。1、将一个Excel表中的多个sheet表合并,并保存到同一个excel。

1importxlrd 2importpandasaspd 3frompandasimportDataFrame 4fromopenpyxlimportload_workbook 5 6excel_name=r"D:\pp.xlsx" 7wb=xlrd.open_workbook(excel_name) 8sheets=wb.sheet_names() 910all>11foriinrange(len(sheets)):12df=pd.read_excel(excel_name,sheet_name=i,index=False,encoding="utf8")13alldata=alldata.append(df)1415writer=pd.ExcelWriter(r"C:\Users\Administrator\Desktop\score.xlsx",engine="openpyxl")16book=load_workbook(writer.path)17writer.book=book18#必须要有上面这两行,假如没有这两行,则会删去其余的sheet表,只保留最终合并的sheet表1920alldata.to_excel(excel_writer=writer,sheet_name="ALLDATA")21writer.save()22writer.close()

结果如下:

五、一表拆分(按照表中某一列进行拆分)1、将一个Excel表,按某一列拆分成多张表。

1importpandasaspd 2importxlsxwriter 3>,encoding="gbk") 4 5area_list=list(set(data["店铺"])) 6 7writer=pd.ExcelWriter(r"C:\Users\Administrator\Desktop\拆好的表1.xlsx",engine="xlsxwriter") 8data.to_excel(writer,sheet_name="总表",index=False) 910forjinarea_list:11df=data[data["店铺"]==j]12df.to_excel(writer,sheet_name=j,index=False)1314writer.save()#一定要加上这句代码,“拆好的表”才会显示出来

结果如下:

推荐阅读

*《》*《》*《》*《》*《》*《》*《》*《》

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。