作為一名金融狗,小白我在上學(xué)的時(shí)候用的統(tǒng)計(jì)建模軟件是R,操作最多的數(shù)據(jù)就是csv文件,導(dǎo)致小白在現(xiàn)在學(xué)習(xí)python的時(shí)候也會(huì)習(xí)慣性地把所有的數(shù)據(jù)都轉(zhuǎn)成csv,然后只會(huì)用pandas.read_csv()。
但其實(shí)平時(shí)咱們會(huì)經(jīng)常性地需要處理excel文件,因此,學(xué)習(xí)如何用python處理excel文件是非常有必要的。
python這么牛批強(qiáng)大的語(yǔ)言,自然提供了多種處理excel文件的包,小白在此只分享自己覺得最好用的一種方式。
首先,自行創(chuàng)建一個(gè)文件夾【小白中學(xué)】,里面又包含子文件夾【小白初中】和【小白高中】?!拘“壮踔小课募A中包含【一年級(jí)】和【二年級(jí)】?jī)蓚€(gè)excel文件,【小白高中】文件夾中也包含【一年級(jí)】和【二年級(jí)】?jī)蓚€(gè)excel文件。而【一年級(jí)】和【二年級(jí)】的表結(jié)構(gòu)一樣,有【班級(jí)A】和【班級(jí)B】?jī)蓚€(gè)sheet,每個(gè)班級(jí)表包含學(xué)生基本信息(學(xué)號(hào)、姓名、生日)。


基本結(jié)構(gòu)如下:

我們先來(lái)看看文件信息:
import os
for root,dirs,files in os.walk(r'F:\小白中學(xué)'):
for file in files:
#獲取文件所屬目錄
print(root)
#文件名
print(file)
#獲取文件路徑
print(os.path.join(root,file))

加載包:
import numpy as np
import pandas as pd
import xlrd
from openpyxl import load_workbook
工作路徑切換到【小白中學(xué)】這個(gè)文件夾所在的路徑:
import os
os.chdir('F:/')
任務(wù)一、將每個(gè)年級(jí)的2個(gè)班級(jí)學(xué)生匯總存到新的sheet
我們先來(lái)做第一個(gè)任務(wù):將初、高中共四個(gè)年級(jí)的四張excel班級(jí)信息分別合并,各自新增一個(gè)sheet記錄匯總的本年級(jí)學(xué)生信息。
for root,dirs,files in os.walk(r'F:\小白中學(xué)'):
for file in files:
#用來(lái)存放每個(gè)excel的所有sheet匯總數(shù)據(jù)
excel_data=pd.DataFrame()
#獲取excel路徑和文件名
excel_name=os.path.join(root,file)
#讀取excel文件
data_wb=xlrd.open_workbook(excel_name)
#獲取文件中所有表格名
sheet_names = data_wb.sheet_names()
#在每一個(gè)excel文件中,讀取所有sheet的數(shù)據(jù),加到all_data
for i in sheet_names:
df = pd.read_excel(excel_name, sheet_name=i, index=False, encoding='utf8')
excel_data=excel_data.append(df)
#生成一個(gè)文件寫入對(duì)象,相當(dāng)于一個(gè)excel
writer = pd.ExcelWriter(excel_name,engine='openpyxl')
book = load_workbook(writer.path)
writer.book = book
#寫入一個(gè)新的sheet
excel_data.to_excel(excel_writer=writer,sheet_name='年級(jí)全體學(xué)生信息')
writer.save()
writer.close()
這時(shí)候我們隨便打開一個(gè)excel(比如打開初中一年級(jí)的excel),發(fā)現(xiàn)多了一個(gè)sheet,記錄了A、B兩個(gè)班級(jí)的匯總學(xué)生信息。

任務(wù)二:將所有的學(xué)生信息匯總到一張新的excel
接下來(lái),我們來(lái)做第一個(gè)任務(wù),將初中高中總共8個(gè)班級(jí)的學(xué)生信息匯總到一張表,并存到一個(gè)excel文件中。
#用來(lái)存放匯總數(shù)據(jù)
all_data=pd.DataFrame()
for root,dirs,files in os.walk(r'F:\小白中學(xué)'):
for file in files:
#獲取excel路徑和文件名
excel_name=os.path.join(root,file)
#讀取excel文件
data_wb=xlrd.open_workbook(excel_name)
#獲取文件中所有表格名
sheet_names = data_wb.sheet_names()
#在每一個(gè)excel文件中,讀取前兩張sheet的數(shù)據(jù),加到all_data
for i in [0,1]:
df = pd.read_excel(excel_name, sheet_name=i, index=False, encoding='utf8')
all_data=all_data.append(df)
查看匯總數(shù)據(jù):
all_data=all_data.reset_index()
all_data

將匯總的dataframe存儲(chǔ)到一張新的excel:
all_data.to_excel(r'F:\小白中學(xué)\學(xué)生信息.xlsx',sheet_name='全校學(xué)生信息')
可以看到【小白中學(xué)】文件夾中多了一個(gè)excel文件。

任務(wù)三:將新生成的學(xué)生信息表拆成4張年級(jí)表存到一個(gè)excel
all_data=pd.read_excel(r'F:\小白中學(xué)\學(xué)生信息.xlsx',sheet_name='全校學(xué)生信息')
#初中一年級(jí)
data1=all_data.iloc[:6,:]
#初中二年級(jí)
data2=all_data.iloc[6:12,:]
#高中一年級(jí)
data3=all_data.iloc[12:18,:]
#高中二年級(jí)
data4=all_data.iloc[18:,:]
將其另存為一個(gè)excel。
with pd.ExcelWriter(r'.\小白中學(xué)\全校學(xué)生信息表.xlsx') as writer:
data1.to_excel(writer, sheet_name='初中一年級(jí)')
data2.to_excel(writer, sheet_name='初中二年級(jí)')
data3.to_excel(writer, sheet_name='高中一年級(jí)')
data4.to_excel(writer, sheet_name='高中二年級(jí)')

查看表信息
