Python?實現(xiàn)多表和工作簿合并及一表按列拆分
一、相關(guān)知識點講解
1.1 需要使用的相關(guān)庫
import?numpy?as?np import?pandas?as?pd import?os
1.2 os.walk(pwd)
先來看看"G:\a"文件夾下有哪些東西:
代碼操作如下:
pwd?=?"G:\\a" print(os.walk(pwd)) for?i?in?os.walk(pwd): ????print(i) for?path,dirs,files?in?os.walk(pwd): ????print(files)
結(jié)果如下:
<generator object walk at 0x0000029BB5AEAB88>
('G:\\a', [], ['aa.txt', 'bb.xlsx', 'cc.txt', 'dd.docx'])
['aa.txt', 'bb.xlsx', 'cc.txt', 'dd.docx']
1.3 os.path.join(path1,path2…)
作用:將多個路徑組合后返回
舉例如下:
path1?=?'G:\\a' path2?=?'aa.txt' print(os.path.join(path1,path2))
結(jié)果如下:
G:\a\aa.txt
1.4 案例解析
舉例如下:
pwd?=?"G:\\a" file_path_list?=?[] for?path,dirs,files?in?os.walk(pwd): ????for?file?in?files: ????????file_path_list.append(os.path.join(pwd,file)) print(file_path_list)
結(jié)果如下:
['G:\\a\\aa.txt','G:\\a\\bb.xlsx','G:\\a\\cc.txt','G:\\a\\dd.docx']
1.5 如何在一個列表中存放多個 DataFrame 數(shù)據(jù)
#?先使用如下代碼創(chuàng)建兩個DataFrame數(shù)據(jù)源。 import?numpy?as?np xx?=?np.arange(15).reshape(5,3) yy?=?np.arange(1,16).reshape(5,3) xx?=?pd.DataFrame(xx,columns=["語文","數(shù)學(xué)","外語"]) yy?=?pd.DataFrame(yy,columns=["語文","數(shù)學(xué)","外語"]) print(xx) print(yy)
結(jié)果如下:
怎么講上述兩個DataFrame拼接在一起?
concat_list?=?[] concat_list.append(xx) concat_list.append(yy) # pd.concat(list)中【默認(rèn)axis=0】默認(rèn)的是數(shù)據(jù)的縱向合并。 # pd.concat(list)括號中傳入的是一個DataFrame列表。 # ignore_list=True表示忽略原有索引,重新生成一組新的索引。 z?=?pd.concat(concat_list,ignore_list=True) print(z) #?或者直接可以寫成z?=?pd.concat([xx,yy],ignore_list=True)
結(jié)果如下:
二、多工作簿合并(一)
2.1 將多個Excel合并到一個Excel中(每個Excel中只有一個sheet表)
操作如下:
import?pandas?as?pd import?os pwd?=?"G:\\b" df_list?=?[] for?path,dirs,files?in?os.walk(pwd): ????for?file?in?files: ????????file_path?=?os.path.join(path,file) ????????df?=?pd.read_excel(file_path) ????????df_list.append(df) result?=?pd.concat(df_list) print(result) result.to_excel('G:\\b\\result.xlsx',index=False)
結(jié)果如下:
三、多工作簿合并(二)
3.1 相關(guān)知識點講解
3.1.1 xlsxwrite 的用法
1)創(chuàng)建一個"工作簿",此時里面會默認(rèn)生成一個名叫"Sheet1"的Sheet表。
import?xlsxwriter #?這一步相當(dāng)于創(chuàng)建了一個新的"工作簿"; #?"demo.xlsx"文件不存在,表示新建"工作簿"; #?"demo.xlsx"文件存在,表示新建"工作簿"覆蓋原有的"工作簿"; workbook?=?xlsxwriter.Workbook("demo.xlsx") #?close是將"工作簿"保存關(guān)閉,這一步必須有。否則創(chuàng)建的文件無法顯示出來。 workbook.close()??
2)創(chuàng)建一個"工作簿"并添加一個"工作表",工作表命名為"2018年銷量"。
import?xlsxwriter workbook?=?xlsxwriter.Workbook("cc.xlsx") worksheet?=?workbook.add_worksheet("2018年銷售量") workbook.close()???
結(jié)果如下:
3)給"2018年銷售量"工作表創(chuàng)建一個表頭,向其中插入一條數(shù)據(jù)。
import?xlsxwriter #?創(chuàng)建一個名為【demo.xlsx】工作簿; workbook?=?xlsxwriter.Workbook("demo.xlsx") #?創(chuàng)建一個名為【2018年銷售量】工作表; worksheet?=?workbook.add_worksheet("2018年銷售量") #?使用write_row方法,為【2018年銷售量】工作表,添加一個表頭; headings?=?['產(chǎn)品','銷量',"單價"] worksheet.write_row('A1',headings) #?使用write方法,在【2018年銷售量】工作表中插入一條數(shù)據(jù); # write語法格式:worksheet.write(行,列,數(shù)據(jù)) data?=?["蘋果",500,8.9] for?i?in?range(len(headings)): ????worksheet.write(1,i,data[i]) workbook.close()
結(jié)果如下:
3.1.2 xlrd 的用法
1)打開某一個存在的excel文件,返回給我們"xlrd.book.Book"工作簿對象; #?這里所說的"打開"并不是實際意義上的打開,只是將該表加載到內(nèi)存中打開。 #?我們并看不到"打開的這個效果" #?以打開上述創(chuàng)建的"test.xlsx"文件為例; import?xlrd file?=?r"G:\Jupyter\test.xlsx" xlrd.open_workbook(file) #?結(jié)果如下: <xlrd.book.Book?at?0x29bb8e4eda0> 2)sheet_names():獲取所有的sheet表表名,假如有多個sheet表,返回一個列表; import?xlrd file?=?r"G:\Jupyter\test.xlsx" fh?=?xlrd.open_workbook(file) fh.sheet_names() #?結(jié)果如下: ['2018年銷售量',?'2019年銷售量'] 3)sheets()方法:返回的是sheet表的對象列表。 #?返回sheet表的對象列表 fh.sheets() #?結(jié)果如下: [<xlrd.sheet.Sheet?at?0x29bb8f07a90>,?<xlrd.sheet.Sheet?at?0x29bb8ef1390>] #?可以利用索引,獲取每一個sheet表的對象 fh.sheets()[0] 結(jié)果是:<xlrd.sheet.Sheet at 0x29bb8f07a90> fh.sheets()[1] 結(jié)果是:<xlrd.sheet.Sheet at 0x29bb8ef1390> 4)返回每一個sheet表的行數(shù)(nrows)?和?列數(shù)(ncols); #?我們可以利用上述創(chuàng)建的sheet表對象,對每一個sheet表進(jìn)行操作; fh.sheets()[0].nrows??#?結(jié)果是:4 fh.sheets()[0].ncols??#?結(jié)果是:3 5)row_values(行數(shù)):獲取每一個sheet表中每一行的數(shù)據(jù); sheet1?=?fh.sheets()[0] for?row?in?range(fh.sheets()[0].nrows): ???value?=?sheet1.row_values(row) ???print(value)
結(jié)果如下:
6)col_values(列數(shù)):獲取每一個sheet表中每一列的數(shù)據(jù); sheet1?=?fh.sheets()[0] for?col?in?range(fh.sheets()[0].ncols): ???value?=?sheet1.col_values(col) ???print(value)
結(jié)果如下:
3.2 將多個 Excel 合并到一個 Excel 中(每個 Excel 中不只一個 sheet 表)
import?xlrd import?xlsxwriter import?os #?打開一個Excel文件,創(chuàng)建一個工作簿對象 def?open_xlsx(file): ????fh=xlrd.open_workbook(file) ????return?fh #?獲取sheet表的個數(shù) def?get_sheet_num(fh): ????x?=?len(fh.sheets()) ????return?x #?讀取文件內(nèi)容并返回行內(nèi)容 def?get_file_content(file,shnum): ????fh=open_xlsx(file) ????table=fh.sheets()[shnum] ????num=table.nrows ????for?row?in?range(num): ????????rdata=table.row_values(row) ????????datavalue.append(rdata) ????return?datavalue def?get_allxls(pwd): ????allxls?=?[] ????for?path,dirs,files?in?os.walk(pwd): ????????for?file?in?files: ????????????allxls.append(os.path.join(path,file)) ????return?allxls #?存儲所有讀取的結(jié)果 datavalue?=?[] pwd?=?"G:\\d" for?fl?in?get_allxls(pwd): ????fh?=?open_xlsx(fl) ????x?=?get_sheet_num(fh) ????for?shnum?in?range(x): ????????print("正在讀取文件:"+str(fl)+"的第"+str(shnum)+"個sheet表的內(nèi)容...") ????????rvalue?=?get_file_content(fl,shnum) #?定義最終合并后生成的新文件 endfile?=?"G:\\d\\concat.xlsx" wb1=xlsxwriter.Workbook(endfile) #?創(chuàng)建一個sheet工作對象 ws=wb1.add_worksheet() for?a?in?range(len(rvalue)): ????for?b?in?range(len(rvalue[a])): ????????c=rvalue[a][b] ????????ws.write(a,b,c) wb1.close() print("文件合并完成")
將上述代碼封裝后如下:
import?xlrd import?xlsxwriter import?os class?Xlrd(): ????def?__init__(self,pwd): ????????self.datavalue?=?[] ????????self.pwd?=?pwd ????#?打開一個Excel文件,創(chuàng)建一個工作簿對象; ????def?open_xlsx(self,fl): ????????fh=xlrd.open_workbook(fl) ????????return?fh ????#?獲取sheet表的個數(shù); ????def?get_sheet_num(self,fh): ????????x?=?len(fh.sheets()) ????????return?x ????#?讀取不同工作簿中每一個sheet中的內(nèi)容,并返回每行內(nèi)容組成的列表; ????def?get_file_content(self,file,shnum): ????????fh?=?self.open_xlsx(file) ????????table=fh.sheets()[shnum] ????????num=table.nrows ????????for?row?in?range(num): ????????????rdata=table.row_values(row) ????????????#?因為每一個sheet表都有一個表頭; ????????????#?這里的判斷語句,把這個表頭去除掉; ????????????#?然后在最后寫入數(shù)據(jù)的,添加上一個表頭,即可; ????????????if?rdata?==?['姓名','性別','年齡','家庭住址']: ????????????????pass ????????????else: ????????????????self.datavalue.append(rdata) ????????return?self.datavalue ????#?獲取xlsx文件的全路徑; ????def?get_allxls(self): ????????allxls?=?[] ????????for?path,dirs,files?in?os.walk(self.pwd): ????????????for?file?in?files: ????????????????allxls.append(os.path.join(path,file)) ????????return?allxls ????#?返回不同工作簿中,所有的sheet表的內(nèi)容列表; ????def?return_rvalue(self): ????????for?fl?in?self.get_allxls(): ????????????fh?=?self.open_xlsx(fl) ????????????x?=?self.get_sheet_num(fh) ????????????for?shnum?in?range(x): ????????????????print("正在讀取文件:"+str(fl)+"的第"+str(shnum)+"個sheet表的內(nèi)容...") ????????????????rvalue?=?self.get_file_content(fl,shnum) ???????return?rvalue class?Xlsxwriter(): ????def?__init__(self,endfile,rvalue): ????????self.endfile?=?endfile ????????self.rvalue?=?rvalue ????def?save_data(self): ????????wb1?=?xlsxwriter.Workbook(endfile) ????????#?創(chuàng)建一個sheet工作對象; ????????ws?=?wb1.add_worksheet("一年級(7)班") ????????#?給文件添加表頭; ????????ws?=?wb1.add_worksheet("2018年銷售量") ????????headings?=?['姓名','性別','年齡','家庭住址']? ????????for?a?in?range(len(self.rvalue)): ????????????for?b?in?range(len(self.rvalue[a])): ????????????????c?=?self.rvalue[a][b] ???????????????#?因為給文件添加了表頭,因此,數(shù)據(jù)從下一行開始寫入; ????????????????ws.write(a+1,b,c) ????????wb1.close() ????????print("文件合并完成") pwd?=?"G:\\d" xl?=?Xlrd(pwd) rvalue?=?xl.return_rvalue() endfile?=?"G:\\d\\concat.xlsx" write?=?Xlsxwriter(endfile,rvalue) write.save_data();
結(jié)果如下:
四、一個工作簿多 heet 合并
4.1 將一個 Excel 表中的多個 sheet 表合并,并保存到同一個excel。
import?xlrd import?pandas?as?pd from?pandas?import?DataFrame from?openpyxl?import?load_workbook excel_name?=?r"D:\pp.xlsx" wb?=?xlrd.open_workbook(excel_name) sheets?=?wb.sheet_names() alldata?=?DataFrame() for?i?in?range(len(sheets)): ????df?=?pd.read_excel(excel_name,?sheet_name=i,?index=False,?encoding='utf8') ????alldata?=?alldata.append(df) writer?=?pd.ExcelWriter(r"C:\Users\Administrator\Desktop\score.xlsx",engine='openpyxl') book?=?load_workbook(writer.path) writer.book?=?book #?必須要有上面這兩行,假如沒有這兩行,則會刪去其余的sheet表,只保留最終合并的sheet表 alldata.to_excel(excel_writer=writer,sheet_name="ALLDATA") writer.save() writer.close()
結(jié)果如下:
五、一表拆分(按照表中某一列進(jìn)行拆分)
5.1 將一個Excel表,按某一列拆分成多張表。
import?pandas?as?pd import?xlsxwriter data=pd.read_excel(r"C:\Users\Administrator\Desktop\chaifen.xlsx",encoding='gbk') area_list=list(set(data['店鋪'])) writer=pd.ExcelWriter(r"C:\Users\Administrator\Desktop\拆好的表1.xlsx",engine='xlsxwriter') data.to_excel(writer,sheet_name="總表",index=False) for?j?in?area_list: ????df=data[data['店鋪']==j] ????df.to_excel(writer,sheet_name=j,index=False) writer.save()??#一定要加上這句代碼,“拆好的表”才會顯示出來
結(jié)果如下:
到此這篇關(guān)于Python 實現(xiàn)多表和工作簿合并及一表按列拆分的文章就介紹到這了,更多相關(guān) Python 表合并內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
多線程爬蟲批量下載pcgame圖片url 保存為xml的實現(xiàn)代碼
用Python寫的多線程爬蟲批量下載pcgame的圖片url并保存為xml格式,主要是邏輯代碼,喜歡的朋友可以測試下2013-01-01python+opencv像素的加減和加權(quán)操作的實現(xiàn)
這篇文章主要介紹了python+opencv像素的加減和加權(quán)操作的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07以Python的Pyspider為例剖析搜索引擎的網(wǎng)絡(luò)爬蟲實現(xiàn)方法
這篇文章主要介紹了以Python的Pyspider為例剖析搜索引擎的網(wǎng)絡(luò)爬蟲實現(xiàn)方法,Pyspider是一個開源項目、用Python語言編寫十分簡潔且具有爬蟲程序的代表性,需要的朋友可以參考下2015-03-03Python進(jìn)階之高級用法詳細(xì)總結(jié)
今天帶各位小伙伴學(xué)習(xí)一下Python高級語法,主要有Lambda表達(dá)式,map函數(shù),filter函數(shù),reduce函數(shù),三大推導(dǎo)式等,文中有非常詳細(xì)的介紹,需要的朋友可以參考下2021-05-05關(guān)于Python正則表達(dá)式 findall函數(shù)問題詳解
在寫正則表達(dá)式的時候總會遇到不少的問題,本文講述了Python正則表達(dá)式中 findall()函數(shù)和多個表達(dá)式元組相遇的時候會出現(xiàn)的問題2018-03-03Python 測試框架unittest和pytest的優(yōu)劣
這篇文章主要介紹了Python 測試框架unittest和pytest的優(yōu)劣,幫助大家更好的進(jìn)行python程序的測試,感興趣的朋友可以了解下2020-09-09Python實現(xiàn)清理微信僵尸粉功能示例【基于itchat模塊】
這篇文章主要介紹了Python實現(xiàn)清理微信僵尸粉功能,結(jié)合實例形式分析了Python使用itchat模塊刪除微信僵尸粉的相關(guān)原理、操作技巧與注意事項,需要的朋友可以參考下2020-05-05