最近上班遇到一个新问题,新上线的医保系统太low,导出数据超过1万条的时候就导不出来了。逼得只有分为小表格导出,然后需要将这些表格汇总为一个大表格。刚好可以带大家学习如何利用Python/ target=_blank class=infotextkey>Python快速合并相同的几个Excel表格。当大家遇到类似问题时候就可以用这个简单办法解决问题了。比如有很多单位给你报表,你还在傻傻地一个表一个表的粘贴复制吗?
我们先来看看效果:
原始导出的文件结果
我导出了9个文件
最后我用Python快速将9个文件合成了一个汇总文件。本文教程给出了n的相同文件合并的方法(不相同文件也可以合并,只是机械地把数据汇总在一个表格中,只需要在参数设置中不设置标题就可以了。)
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的操作,这里简单说明,在基础学习中不做过多探讨。
本文使用一下几个xlrd的操作。
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学习笔记的链接,贡献给各位粉丝们,能够阅读到这个地方也真心感谢您的支持!
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()