老旧xls读取合并(97-03版本)混合新版xlsx
背景
最近工作需要进行多个Excel文件的合并,表头是一样的,就是版本有差异。特别是恶心的xls,pandas读取就编码报错,utf-8 gbk啥的都试过还是不行。实在没办法只好接入xlrd进行读取,然后拼成df处理 合并。这里有局限性,大家自己看着改
合并上述xls
解决方法
用这个代码进行读取read_xls(path,index=1) path是Excel文件路径,index是sheet的序号(e.g., sheet1 就写1)
def read_xls_excel(url,index):
#这个函数只能读出数据
'''
读取xls格式文件
参数:
url:文件路径
index:工作表序号(第几个工作表,传入参数从1开始数)
返回:
data:表格中的数据
'''
# 打开指定的工作簿
workbook = xlrd.open_workbook(url)
# 获取工作簿中的所有表格
sheets = workbook.sheet_names()
# 获取工作簿中所有表格中的的第 index 个表格
worksheet = workbook.sheet_by_name(sheets[index-1])
# 定义列表存储表格数据
data = []
# 遍历每一行数据
for i in range(0, worksheet.nrows):
# 定义表格存储每一行数据
da = []
# 遍历每一列数据
for j in range(0, worksheet.ncols):
# 将行数据存储到da列表
da.append(worksheet.cell_value(i, j))
# 存储每一行数据
data.append(da)
# 返回数据
return data
def read_xls(path,index=1):
#拼接xls成DF使用pandas接入
data=read_xls_excel(path,index)
df=pd.DataFrame(data[1:],columns=data[0])
return df
完整读取文件代码
import xlrd
import pandas as pd
import os
def find_excel(filename):
#定义获取excel文件路径
root_files_Global=[]
for root, dirs, files in os.walk('{}'.format(filename)):
#os.walk能快速分出文件和类型
for i in range(len(files)):
#拿xls和xlsx文件
if 'xls' in files[i] or 'xlsx' in files[i]:
root_files_Global.append(root+'/'+files[i])
return root_files_Global
def read_xls_excel(url,index):
#这个函数只能读出数据
'''
读取xls格式文件
参数:
url:文件路径
index:工作表序号(第几个工作表,传入参数从1开始数)
返回:
data:表格中的数据
'''
# 打开指定的工作簿
workbook = xlrd.open_workbook(url)
# 获取工作簿中的所有表格
sheets = workbook.sheet_names()
# 获取工作簿中所有表格中的的第 index 个表格
worksheet = workbook.sheet_by_name(sheets[index-1])
# 定义列表存储表格数据
data = []
# 遍历每一行数据
for i in range(0, worksheet.nrows):
# 定义表格存储每一行数据
da = []
# 遍历每一列数据
for j in range(0, worksheet.ncols):
# 将行数据存储到da列表
da.append(worksheet.cell_value(i, j))
# 存储每一行数据
data.append(da)
# 返回数据
return data
def read_xls(path,index=1):
#拼接xls成DF使用pandas接入
data=read_xls_excel(path,index)
df=pd.DataFrame(data[1:],columns=data[0])
return df
#处理路径
run_path=r'你的文件夹'
#保存文件路径
save_path=r'汇总后文件名'
root_files_Global=find_excel(run_path)
try:
df=pd.read_excel(root_files_Global[0])
except:
df=read_xls(root_files_Global[0])
for i in root_files_Global[1:]:
try:
df=pd.concat([df,pd.read_excel(i)])
except:
df=pd.concat([df,read_xls(i)])
df.to_excel(save_path,index=False)
df
改这俩参数就好:
#处理路径
run_path=r’你的文件夹’
#保存文件路径
save_path=r’汇总后文件名’
局限性
1.只适合表头一样的
2.csv没弄,懒&反正也没人看 :)
3.保存的是xlsx