当前位置: 首页 > article >正文

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}秒')


http://www.kler.cn/a/565073.html

相关文章:

  • vue3中ref和reactive响应式数据、ref模板引用(组合式和选项式区别)、组件ref的使用
  • 自动化问题汇总
  • XSS-labs靶场通关
  • Ollama下载安装+本地部署DeepSeek+UI可视化+搭建个人知识库——详解!(Windows版本)
  • MySQL分库分表之带来查询相关问题
  • springboot413-基于Java高校科技创新项目评审系统的设计与实现(源码+数据库+纯前后端分离+部署讲解等)
  • 如何防止 Docker 注入了恶意脚本
  • Android14窗口管理自适应投屏分辨率
  • 【论文笔记】ClipSAM: CLIP and SAM collaboration for zero-shot anomaly segmentation
  • Python学习第十八天之深度学习之Tensorboard
  • 《deepseek FlashMLA :高效的 MLA 解码内核》:此文为AI自动翻译
  • STM32G473VET6 在 Keil MDK 下手动移植 FreeRTOS 指南
  • ROS的action通信——实现阶乘运算(二)
  • 【Java项目】基于Spring Boot的校园闲置物品交易网站
  • 架构师论文《论湖仓一体架构及其应用》
  • 类和对象——const修饰的类的对象和函数
  • DavGo简单部署WebDAV服务
  • 【Deepseek学习大模型】Roofline计算规则
  • FastAPI 学习笔记
  • C++ Qt常见面试题(4):Qt事件过滤器