Python在实际工作中的运用-合并XLSX表格的新方法
继续上篇《Python在实际工作中的运用-合并Excel表格》使用了一段时间后,发现对于行数比较少的表格采用此方法可以非常高效的完成数据合并,但是数据量较大时,如达到单个工作表几十万行时速度就会变慢甚至死机,结合《Python在实际工作中的运用-通用格式CSV文件自动转换XLSX》这篇文章所用到的知识,对多个上十万级别数据进行合并XLSX表格产生了新的思路:可以将sheet工作表逐个导入到SQLite里合并,然后再导出为单个合并后的Excel文件,脚本如下:
本脚本只需要设置好file_path_name参数,运行脚本即可得到合并后的表格
# 待合并表格路径
file_path_name=f"D:\工作簿1.xlsx"
完整代码如下:
import os
import sqlite3
import time
import warnings
from pathlib import Path
import pandas as pd
from openpyxl import load_workbook
warnings.filterwarnings('ignore')
# 待合并表格路径
file_path_name=f"D:\工作簿1.xlsx"
# 跳过行数(用于跳过不需要的行,请不要跳过标题行,会报错)
skiprows_num = 0
# 获取CSV文件所在目录
file_dirname = os.path.dirname(file_path_name)
# 获取CSV文件名(不带扩展名)
file_name = Path(file_path_name).stem
# 删除重建数据库
dbfile_path_name = f'{file_dirname}/{file_name}.db'
if os.path.exists(dbfile_path_name):
os.remove(dbfile_path_name)
# 连接到 SQLite 数据库(如果数据库文件不存在,会自动创建一个新的数据库文件)
conn = sqlite3.connect(dbfile_path_name)
else:
conn = sqlite3.connect(dbfile_path_name)
# 记录开始时间
start_time = time.time()
wb = load_workbook(file_path_name)
sheets = wb.sheetnames
# 将Excel表格存入SQLite库中
for i in sheets:
try:
df = pd.read_excel(file_path_name, sheet_name=i,engine='openpyxl',skiprows=skiprows_num)
df.to_sql(f'{file_name}',conn,if_exists='append',index=False)
print(f'{file_name}的[{i}]完成合并')
except Exception as e:
print(f'{file_name}[{i}]报错:{e}')
# 在这里将导入的数据经过SQLite数据库转化为Excel表导出
df = pd.read_sql_query(f'select * from {file_name}',conn)
df.to_excel(f'{file_dirname}/{file_name}_(合并).xlsx',index=False)
# 记录结束时间
end_time = time.time()
print(f'共完成{file_name}的{len(sheets)}个子表的合并,导出路径{file_dirname}\\{file_name}_(合并).xlsx,用时:{end_time-start_time}秒')