最近上班遇到一個新問題,新上線的醫保系統太low,導出數據超過1萬條的時候就導不出來了。逼得只有分為小表格導出,然后需要將這些表格匯總為一個大表格。剛好可以帶大家學習如何利用Python/ target=_blank class=infotextkey>Python快速合并相同的幾個Excel表格。當大家遇到類似問題時候就可以用這個簡單辦法解決問題了。比如有很多單位給你報表,你還在傻傻地一個表一個表的粘貼復制嗎?
我們先來看看效果:
原始導出的文件結果
我導出了9個文件
最后我用Python快速將9個文件合成了一個匯總文件。本文教程給出了n的相同文件合并的方法(不相同文件也可以合并,只是機械地把數據匯總在一個表格中,只需要在參數設置中不設置標題就可以了。)
os庫
- 路徑操作,使用子庫path,處理文件路徑及信息
- 進程管理,啟動系統中其他程序
- 環境參數:獲取系統軟硬件信息等環境參數
path子庫
os.listdir(url)#返回一個對應目錄下所有文件名稱的列表
使用需要引入path庫
import os.path as op
操作 |
含有 |
os.path.abspath(path) |
返回path在當前系統中的絕對路徑 |
os.path.normpath(path) |
返回統一用""分隔路徑 |
os.path.relpath(path) |
返回當前程序與文件之間的相對路徑 |
os.path.dirname(path) |
返回path中的目錄名稱 |
os.path.basename(path) |
返回path中的最后的文件名稱 |
os.path.join(path,*paths) |
組合path與paths,返回一個路徑字符串 |
os.path.exists(path) |
判斷路徑對應的文件或者目錄是否存在 |
os.path.isfile(path) |
判斷路徑是否指向一個文件 |
os.path.isdir(path) |
判斷路徑是否指向一個目錄 |
os.path.getatime(path) |
返回上一次訪問該路徑的時間 |
os.path.getmtime(path) |
返回路徑對應文件或目錄最近修改時間 |
os.path.getctime(path) |
返回路徑對應文件或目錄創建時間 |
os.path.getsize(path) |
返回路徑對應文件或目錄字節大小 |
進程管理
執行程序或命令(cmd下的命令)
import os
os.system("c:\windows\System32\calc.exe")
打開系統計算器
import os
#下面的程序可以打開當前目錄下的參數配置文件
os.startfile(r".合并Excel文件參數配置.txt")
環境參數
操作 |
含有 |
os.chdir(path) |
修改當前程序操作的路徑 |
os.getcwd() |
返回程序的當前路徑 |
os.getlogin() |
獲取當前系統登錄用戶名稱 |
os.cpu_count() |
獲取當前系統cpu數量 |
os.urandom(n) |
獲取n個字節長度的隨機字符串 |
xlrd庫與xlwt庫
本文使用一下幾個xlrd的操作,這里簡單說明,在基礎學習中不做過多探討。
- data = xlrd.open_workbook(url) # 文件名以及路徑,如果路徑或者文件名有中文給前面加一個r拜師原生字符。
- table = data.sheets()[0] # 通過索引順序獲取
- nrows = table.nrows # 獲取該sheet中的有效行數
- num = table.row_values(i) # 返回由該行中所有單元格的數據組成的列表
本文使用一下幾個xlrd的操作。
- wa = xlwt.Workbook() # 創建工作簿
- b = wa.add_sheet('匯總') # 添加“匯總”工作表
- b.write(i, j, v) # 寫入數據
本程序需要使用的庫文件
import os
import os.path as op
import xlrd as xlrd
import xlwt as xlwt
本次程序的接口參數
使用text文件作為接口文件,事先定義好3個接口參數(要合并的文件目錄、是否存在標題、合并后生產文件的文件名稱)。下面的備注信息為我設置的接口參數,大家可以根據自己的需要設置
<提示文本>在下面一行配置準備合并的Excel文件目錄:
C:UsersAdministratorDesktop測試目錄
<提示文本>第一行是否為標題行1表示是,0表示否:
1
<提示文本>設置匯總文件的文件名及文件格式:
匯總.xlsx
下面是設置接口參數的Python函數(之前案例多次講解,直接給出代碼很簡單的):
def set_param():
'''在當前文件目錄下配置參數文件,若文件存在則打開文件,不存在則創建一個參數文件再打開'''
try:
f = open(r".合并Excel文件參數配置.txt", "x", encoding="utf-8")
data = '<提示文本>在下面一行配置準備合并的Excel文件目錄:nC:\Users\Administrator\Desktop\測試目錄n<提示文本>第一行是否為標題行1表示是,0表示否:n0n<提示文本>設置匯總文件的文件名及文件格式:n匯總.xlsx'
f.write(data)
f.close()
except FileExistsError:
pass
os.startfile(r".合并Excel文件參數配置.txt")
以上代碼可以檢查python程序目錄下是否有接口文件,如有就打開供用戶修改,沒有就生產一個新的默認接口文件,再打開供用戶修改。
程序獲取配置好的接口參數
def get_param():
'''獲取用戶配置好的配置文件'''
param = {}
f = open(r".合并Excel文件參數配置.txt", "r", encoding="utf-8")
file_data = f.readlines()
f.close()
param["url"] = file_data[1].replace('n', "")
param["title"] = eval(file_data[3].replace('n', ""))
param["file_name"] = file_data[5].replace('n', "")
return param
非常簡單,之前多次分析過,就不再多說了。
本程序的核心程序類型,合并操作
基本思想就是通過os操作獲取目標目錄下的所有文件名列表,再循環遍歷這些文件(需要使用op.join(param["url"], file)來打開完整的具體文件路徑,不懂的可以回頭看看本文上面講述的os庫子庫path的具體操作)
然后通過xlrd庫讀取數據出入二位列表values中
最后通過xlwt庫將values中的數據輸出到需要保持的Excel文件中
以下給出具體的代碼:
def merge_excel(param):
'''合并同類型的Excel文件'''
files = os.listdir(param["url"])
values = [] # 存放獲取的Excel文件內容
for file in files:
if file == param["file_name"]: continue # 不統計與匯總文件同名的文件,避免可能的重復統計
# 將所有文件的內容都放入values變量中
url = op.join(param["url"], file)
data = xlrd.open_workbook(url)
table = data.sheets()[0]
nrows = table.nrows
if param["title"] == 1:
# 若文件存在標題,把第一個讀取到的文件標題做問所有內容的標題
if file == files[0]:
title = table.row_values(0)
title.Append("數據來源")
values.append(title)
for i in range(param["title"], nrows):
val = table.row_values(i)
val.append(file)
values.append(val)
wa = xlwt.Workbook() # 創建工作簿
b = wa.add_sheet('匯總') # 添加“匯總”工作表
for i in range(len(values)):
# 寫入數據
for j in range(len(values[i])):
b.write(i, j, values[i][j])
wa.save(op.join(param["url"], param["file_name"]))
print("文件合并成功")
為了增強程序互動,設計一個非常簡單的菜單。
這個菜單可以很方便地修改為其他程序的菜單,大家可以看看,非常之簡單
def menu():
'''打印用戶交互界面,獲取用戶操作'''
print("合并同類Excel文件".center(48, "*"))
print("1.配置參數")
print("2.運行合并程序")
print("3.打開合并后文件目錄")
print("4.退出程序")
print("".center(50, "*"))
while True:
try:
s = eval(input("請輸入操作序號"))
except:
s = 0
if s in [1, 2, 3, 4]:
return s
else:
print('輸入錯誤請重新輸入')
最后就是控制流程主函數了
def main():
while True:
m = menu()
if m == 1:
set_param()
input("設置好后按回車繼續")
elif m == 2:
param = get_param()
merge_excel(param)
elif m == 3:
try:
os.startfile(param["url"])
except:
print("還沒有獲取到配置參數中的文件路徑,請先運行合并程序,輸入2運行合并程序")
elif m == 4:
break
結語
今天終于把最后一篇python基礎的操作寫完了,來頭條寫文章最大的收獲不少一分兩分錢,而是真正的可以鞭策自己主動學習,持續學習。雖然一個上班族有的時候確實很忙,但能夠學習進步、分析知識也比無聊玩手機好很多,感興趣的可以一起討論學習,共同進步。這是全套基礎Python學習筆記的鏈接,貢獻給各位粉絲們,能夠閱讀到這個地方也真心感謝您的支持!
最基礎的python學習筆記(入門級)
本文全部代碼
import os
import os.path as op
import xlrd as xlrd
import xlwt as xlwt
def menu():
'''打印用戶交互界面,獲取用戶操作'''
print("合并同類Excel文件".center(48, "*"))
print("1.配置參數")
print("2.運行合并程序")
print("3.打開合并后文件目錄")
print("4.退出程序")
print("".center(50, "*"))
while True:
try:
s = eval(input("請輸入操作序號"))
except:
s = 0
if s in [1, 2, 3, 4]:
return s
else:
print('輸入錯誤請重新輸入')
def set_param():
'''在當前文件目錄下配置參數文件,若文件存在則打開文件,不存在則創建一個參數文件再打開'''
try:
f = open(r".合并Excel文件參數配置.txt", "x", encoding="utf-8")
data = '<提示文本>在下面一行配置準備合并的Excel文件目錄:nC:\Users\Administrator\Desktop\測試目錄n<提示文本>第一行是否為標題行1表示是,0表示否:n0n<提示文本>設置匯總文件的文件名及文件格式:n匯總.xlsx'
f.write(data)
f.close()
except FileExistsError:
pass
os.startfile(r".合并Excel文件參數配置.txt")
def get_param():
'''獲取用戶配置好的配置文件'''
param = {}
f = open(r".合并Excel文件參數配置.txt", "r", encoding="utf-8")
file_data = f.readlines()
f.close()
param["url"] = file_data[1].replace('n', "")
param["title"] = eval(file_data[3].replace('n', ""))
param["file_name"] = file_data[5].replace('n', "")
return param
def merge_excel(param):
'''合并同類型的Excel文件'''
files = os.listdir(param["url"])
values = [] # 存放獲取的Excel文件內容
for file in files:
if file == param["file_name"]: continue # 不統計與匯總文件同名的文件,避免可能的重復統計
# 將所有文件的內容都放入values變量中
url = op.join(param["url"], file)
data = xlrd.open_workbook(url)
table = data.sheets()[0]
nrows = table.nrows
if param["title"] == 1:
# 若文件存在標題,把第一個讀取到的文件標題做問所有內容的標題
if file == files[0]:
title = table.row_values(0)
title.append("數據來源")
values.append(title)
for i in range(param["title"], nrows):
val = table.row_values(i)
val.append(file)
values.append(val)
wa = xlwt.Workbook() # 創建工作簿
b = wa.add_sheet('匯總') # 添加“匯總”工作表
for i in range(len(values)):
# 寫入數據
for j in range(len(values[i])):
b.write(i, j, values[i][j])
wa.save(op.join(param["url"], param["file_name"]))
print("文件合并成功")
def main():
while True:
m = menu()
if m == 1:
set_param()
input("設置好后按回車繼續")
elif m == 2:
param = get_param()
merge_excel(param)
elif m == 3:
try:
os.startfile(param["url"])
except:
print("還沒有獲取到配置參數中的文件路徑,請先運行合并程序,輸入2運行合并程序")
elif m == 4:
break
main()