上文介绍了python通过DuckDB和pyxlsbwriter模块生成xlsb文件,因为python是解释执行,它的速度有点慢,pypy是另一种python解释器,它使用即时编译(JIT)技术来提高执行速度。
因为DuckDB与pypy不兼容,所以让DeepSeek帮助编写了不依赖DuckDB和pandas,直接使用python csv模块将csv文件内容写入多sheet的xlsb文件的程序。
源代码csv2xlsb.py如下:

import csv
import math
from pyxlsbwriter import XlsbWriterdef csv_to_xlsb(csv_file,output_file,sheet_prefix="Sheet",max_rows_per_sheet=1048575,  # XLSB 单 Sheet 最大行数compression_level=6,has_header=True
):"""将大型 CSV 文件分 Sheet 写入 XLSB 文件参数:csv_file (str): 输入 CSV 文件路径output_file (str): 输出 XLSB 文件路径sheet_prefix (str): Sheet 名称前缀max_rows_per_sheet (int): 每个 Sheet 最大行数compression_level (int): 压缩级别(0-9)has_header (bool): CSV 是否包含标题行"""# 首先计算总行数(为了确定需要的 Sheet 数量)with open(csv_file, 'r', newline='', encoding='utf-8') as f:total_rows = sum(1 for _ in csv.reader(f)) - (1 if has_header else 0)num_sheets = math.ceil(total_rows / max_rows_per_sheet)print(f"CSV 文件共有 {total_rows} 行数据,将分成 {num_sheets} 个 Sheet 写入")with XlsbWriter(output_file, compressionLevel=compression_level) as writer:with open(csv_file, 'r', newline='', encoding='utf-8') as f:csv_reader = csv.reader(f)# 读取标题行(如果有)headers = next(csv_reader) if has_header else Nonecurrent_sheet = 0current_row = 0sheet_data = []# 添加标题行到第一个 Sheetif headers:sheet_data.append(headers)for row in csv_reader:sheet_data.append(row)current_row += 1# 当达到最大行数时写入当前 Sheet 并创建新 Sheetif current_row >= max_rows_per_sheet:# 写入当前 Sheetsheet_name = f"{sheet_prefix}_{current_sheet + 1}"writer.add_sheet(sheet_name)writer.write_sheet(sheet_data)print(f"已写入 Sheet: {sheet_name},行数: {len(sheet_data)}")# 准备下一个 Sheetcurrent_sheet += 1current_row = 0sheet_data = []if headers:  # 新 Sheet 也包含标题行sheet_data.append(headers)# 写入最后一个 Sheet(可能未达到最大行数)if sheet_data:sheet_name = f"{sheet_prefix}_{current_sheet + 1}"writer.add_sheet(sheet_name)writer.write_sheet(sheet_data)print(f"已写入 Sheet: {sheet_name},行数: {len(sheet_data)}")if __name__ == "__main__":# 示例用法csv_to_xlsb(csv_file="5m Sales Records.csv",output_file="sheets.xlsb",sheet_prefix="Data",max_rows_per_sheet=1048575,  # 每个 Sheet 100 万行compression_level=6,has_header=True)

下面是在pypy中安装pyxlsbwriter并执行的步骤

C:\d\pypy>pypy3 -m ensurepip
Successfully installed pip-24.0 setuptools-65.5.0C:\d\pypy>pypy3 -m pip install pyxlsbwriter
Successfully installed pyxlsbwriter-0.0.3C:\d\pypy>cd ..C:\d>timer64 pypy\pypy3 csv2xlsb.pyKernel  Time =     1.750 =    2%
User    Time =    58.546 =   97%
Process Time =    60.296 =  100%    Virtual  Memory =   3858 MB
Global  Time =    60.271 =  100%    Physical Memory =   3828 MB

我把第一步生成的sheets.xlsb文件改名为pypysheets.xlsb,以便比较。再用python执行同样的代码。

C:\d>move sheets.xlsb pypysheets.xlsb
移动了         1 个文件。C:\d>timer64 python csv2xlsb.py
CSV 文件共有 5000000 行数据,将分成 5 个 Sheet 写入
已写入 Sheet: Data_1,行数: 1048576
已写入 Sheet: Data_2,行数: 1048576
已写入 Sheet: Data_3,行数: 1048576
已写入 Sheet: Data_4,行数: 1048576
已写入 Sheet: Data_5,行数: 805701Kernel  Time =     1.640 =    1%
User    Time =    85.218 =   97%
Process Time =    86.859 =   99%    Virtual  Memory =   4728 MB
Global  Time =    87.267 =  100%    Physical Memory =   4724 MB

可见pypy3执行时间比python缩短了三分之一。再比较两个生成的文件,大小完全一致,再用FC命令比较,发现还是存在差异的。

C:\d>dir *sheets.xlsb2025/08/17  18:32       201,303,180 pypysheets.xlsb
2025/08/17  18:34       201,303,180 sheets.xlsbC:\d>fc /b sheets.xlsb pypysheets.xlsb
正在比较文件 sheets.xlsb 和 PYPYSHEETS.XLSB
024E15D8: 37 F5
024E15D9: 94 93
024E16D0: 37 F5
024E16D1: 94 93
...
0BFFA380: 57 0A
0BFFA3BD: 57 0A
0BFFA3F8: 57 0A

那pypy生成的文件到底对不对,能不能用,还是用rust_sheet插件来读取,比较如下:
先读取用python生成的sheets.xlsb

D create table xlsb as from read_sheet('sheets.xlsb',header=1,sheet_name='Data_1')
union all from read_sheet('sheets.xlsb',header=1,sheet_name='Data_2')
union all from read_sheet('sheets.xlsb',header=1,sheet_name='Data_3')
union all from read_sheet('sheets.xlsb',header=1,sheet_name='Data_4')
union all from read_sheet('sheets.xlsb',header=1,sheet_name='Data_5');
100% ▕████████████████████████████████████████████████████████████▏
Run Time (s): real 47.218 user 52.890625 sys 2.437500
D summarize xlsb;
┌────────────────┬─────────────┬─────────────┬────────────────────┬───┬───────┬───────┬─────────┬─────────────────┐
│  column_name   │ column_type │     min     │        max         │ … │  q50  │  q75  │  count  │ null_percentage │
│    varcharvarcharvarcharvarchar       │   │ int32 │ int32 │  int64  │  decimal(9,2)   │
├────────────────┼─────────────┼─────────────┼────────────────────┼───┼───────┼───────┼─────────┼─────────────────┤
│ Region         │ VARCHAR     │ Asia        │ Sub-Saharan Africa │ … │  NULLNULL50000000.00 │
│ Country        │ VARCHAR     │ Afghanistan │ Zimbabwe           │ … │  NULLNULL50000000.00 │
│ Item TypeVARCHAR     │ Baby Food   │ Vegetables         │ … │  NULLNULL50000000.00 │
│ Sales Channel  │ VARCHAR     │ Offline     │ Online             │ … │  NULLNULL50000000.00 │
│ Order Priority │ VARCHAR     │ C           │ M                  │ … │  NULLNULL50000000.00 │
│ Order DateVARCHAR1/1/20109/9/2020           │ … │  NULLNULL50000000.00 │
│ Order ID       │ VARCHAR100000321999999892          │ … │  NULLNULL50000000.00 │
│ Ship DateVARCHAR1/1/20109/9/2020           │ … │  NULLNULL50000000.00 │
│ Units Sold     │ VARCHAR19999               │ … │  NULLNULL50000000.00 │
│ Unit Price     │ VARCHAR109.289.33               │ … │  NULLNULL50000000.00 │
│ Unit Cost      │ VARCHAR117.1197.44              │ … │  NULLNULL50000000.00 │
│ Total Revenue  │ VARCHAR1000003.46999931.76          │ … │  NULLNULL50000000.00 │
│ Total Cost     │ VARCHAR1000.23999979.98          │ … │  NULLNULL50000000.00 │
│ Total Profit   │ VARCHAR100.2499997.92           │ … │  NULLNULL50000000.00 │
├────────────────┴─────────────┴─────────────┴────────────────────┴───┴───────┴───────┴─────────┴─────────────────┤
│ 14 rows                                                                                    12 columns (8 shown) │
└─────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
Run Time (s): real 0.238 user 2.031250 sys 0.140625

再读取用pypy生成, 改名后的pypysheets.xlsb

D create table xlsb as from read_sheet('pypysheets.xlsb',header=1,sheet_name='Data_1')
union all from read_sheet('pypysheets.xlsb',header=1,sheet_name='Data_2')
union all from read_sheet('pypysheets.xlsb',header=1,sheet_name='Data_3')
union all from read_sheet('pypysheets.xlsb',header=1,sheet_name='Data_4')
union all from read_sheet('pypysheets.xlsb',header=1,sheet_name='Data_5');
100% ▕████████████████████████████████████████████████████████████▏
Run Time (s): real 45.734 user 43.078125 sys 2.531250
D summarize xlsb;
┌────────────────┬─────────────┬─────────────┬────────────────────┬───┬───────┬───────┬─────────┬─────────────────┐
│  column_name   │ column_type │     min     │        max         │ … │  q50  │  q75  │  count  │ null_percentage │
│    varcharvarcharvarcharvarchar       │   │ int32 │ int32 │  int64  │  decimal(9,2)   │
├────────────────┼─────────────┼─────────────┼────────────────────┼───┼───────┼───────┼─────────┼─────────────────┤
│ Region         │ VARCHAR     │ Asia        │ Sub-Saharan Africa │ … │  NULLNULL50000000.00 │
│ Country        │ VARCHAR     │ Afghanistan │ Zimbabwe           │ … │  NULLNULL50000000.00 │
│ Item TypeVARCHAR     │ Baby Food   │ Vegetables         │ … │  NULLNULL50000000.00 │
│ Sales Channel  │ VARCHAR     │ Offline     │ Online             │ … │  NULLNULL50000000.00 │
│ Order Priority │ VARCHAR     │ C           │ M                  │ … │  NULLNULL50000000.00 │
│ Order DateVARCHAR1/1/20109/9/2020           │ … │  NULLNULL50000000.00 │
│ Order ID       │ VARCHAR100000321999999892          │ … │  NULLNULL50000000.00 │
│ Ship DateVARCHAR1/1/20109/9/2020           │ … │  NULLNULL50000000.00 │
│ Units Sold     │ VARCHAR19999               │ … │  NULLNULL50000000.00 │
│ Unit Price     │ VARCHAR109.289.33               │ … │  NULLNULL50000000.00 │
│ Unit Cost      │ VARCHAR117.1197.44              │ … │  NULLNULL50000000.00 │
│ Total Revenue  │ VARCHAR1000003.46999931.76          │ … │  NULLNULL50000000.00 │
│ Total Cost     │ VARCHAR1000.23999979.98          │ … │  NULLNULL50000000.00 │
│ Total Profit   │ VARCHAR100.2499997.92           │ … │  NULLNULL50000000.00 │
├────────────────┴─────────────┴─────────────┴────────────────────┴───┴───────┴───────┴─────────┴─────────────────┤
│ 14 rows                                                                                    12 columns (8 shown) │
└─────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
Run Time (s): real 0.240 user 1.843750 sys 0.343750

读取时间基本一致,内容也一致。
所以,可以放心利用pypy加速pyxlsbwriter生成xlsb文件。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/93500.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/93500.shtml
英文地址,请注明出处:http://en.pswp.cn/web/93500.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Java后端】Spring Boot 集成 MyBatis-Plus 全攻略

Spring Boot 集成 MyBatis-Plus 全攻略 1. 为什么选择 MyBatis-Plus 零侵入:在 MyBatis 基础上增强,不影响现有功能。内置 CRUD:无需写 XML/SQL,直接调用 BaseMapper 方法。强大插件:分页插件、性能分析、乐观锁、多租…

LangChain 多任务应用开发

Q: LangChain dify coze是竞品关系 都是AI Agent搭建平台,dify和coze 属于低代码,langChain属于高代码,coze优于dify Q:向量数据库是存储向量,做相似度检索的,可以用faiss milvus chromdb Q:使用…

实用技巧:Oracle中精准查看表占用空间大小

目录实用技巧:Oracle中精准查看表占用空间大小一、为什么需要精准统计表空间占用?二、完整查询SQL:覆盖表、LOB、索引三、SQL语句关键逻辑解析1. 基础表:dba_tables 与 dba_tablespaces2. 子查询1:统计表段空间&#x…

openEuler等Linux系统中如何复制移动硬盘的数据

在 openEuler 系统中,提示 “You should mount volume first” ,意思是需要先挂载移动硬盘的分区才能访问: 安装必要软件(针对特殊文件系统) 如果移动硬盘是 NTFS 等非 Linux 原生支持的文件系统格式,需要安装对应的支持软件,以挂载 NTFS 格式移动硬盘为例,需要安装 …

java如何把字符串数字转换成数字类型

在Java中将字符串数字转换为数字类型有多种方法,以下是详细说明和示例代码: 一、基础转换方法 Integer.parseInt() String str "123"; int num Integer.parseInt(str); // 转换为intDouble.parseDouble() String str "3.14"; dou…

WPFC#超市管理系统(6)订单详情、顾客注册、商品销售排行查询和库存提示、LiveChat报表

WPF&C#超市管理系统10. 订单详情10.1 页面布局10.2 功能实现11. 顾客注册12. 商品销售排行查询与库存提示14. LiveChart报表总结10. 订单详情 10.1 页面布局 页面分三行布置,第一行复用OutstorageView界面的第一行,将属性和命令修改为顾客相关第二…

【Linux】文件基础IO

1.关于文件的共识原理 1.文件内容属性 2.文件分为打开的文件和没打开的文件 3.打开的文件: 文件被打开必须先被加载到内存,所以本质是研究进程和文件的关系,一个进程可以打开多个文件。操作系统内部一定存在大量被打开的文件,要进…

基于微信小程序的生态农产销售管理的设计与实现/基于C#的生态农产销售系统的设计与实现、基于asp.net的农产销售系统的设计与实现

基于微信小程序的生态农产销售管理的设计与实现/基于C#的生态农产销售系统的设计与实现、基于asp.net的农产销售系统的设计与实现

Java研学-SpringCloud(五)

一 Nacos 配置中心 1 引入依赖 – services.pom每个微服务都需要<!--配置中心--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId></dependency>2 配置文件 –…

.NET 中的延迟初始化:Lazy<T> 与LazyInitializer

标签&#xff1a;线程安全、延迟初始化、按需初始化、提升启动性能 项目地址&#xff1a;NitasDemo/12Lazy/LazyDemo at main Nita121388/NitasDemo 目录Lazy<T>1. 概念2. 基本用法 3. 异常处理 4. 线程安全模式 5. 示例1. 线程安全模式 (ExecutionAndPublication)2. 发…

【LLIE专题】LLIE低照度图像结构先验提取方法

Zero-Shot Day-Night Domain Adaptation with a Physics Prior&#xff08;ICCV,2021&#xff09;专题介绍一、研究背景二、方法1. 物理反射模型与颜色不变特征的推导&#xff08;原理推导、物理依据&#xff09;2. 颜色不变特征的计算&#xff08;特征计算公式整个过程&#x…

Font Awesome Kit 使用详解

在现代网页设计中&#xff0c;图标是提升用户体验的关键元素。而 Font Awesome 作为最受欢迎的图标库&#xff0c;其最新版本 Font Awesome 7 通过 Kit 功能提供了更便捷高效的集成方式。本文将带你全面了解如何使用 Font Awesome Kit&#xff0c;让你的网站图标管理变得轻松高…

第七十八章:AI的“智能美食家”:输出图像风格偏移的定位方法——从“滤镜病”到“大师风范”!

AI图像风格偏移前言&#xff1a;AI的“火眼金睛”——输出图像风格偏移的定位方法&#xff01;第一章&#xff1a;痛点直击——“画风跑偏”&#xff1f;AI生成艺术的“审美危机”&#xff01;第二章&#xff1a;探秘“画风密码”&#xff1a;什么是风格偏移&#xff1f;它藏在…

Android原生(Kotlin)与Flutter混合开发 - 设备控制与状态同步解决方案

Kotlin 原生实现 (Android) 1.1 AndroidManifest.xml <manifest xmlns:android"http://schemas.android.com/apk/res/android"package"com.afloia.smartconnect"><applicationandroid:name".MainApplication"android:label"Smart …

已开源:Highcharts.NET,Highcharts Android,与Highcharts iOS集成

近期了解到&#xff0c;Highcharts官方宣布将Highcharts.NET&#xff0c;Highcharts Android&#xff0c;与Highcharts iOS集成转换为开源。对于Highcharts提供世界一流的数据可视化工具&#xff0c;一直致力于将资源集中在可以为您提供最大价值的地方。官方提到&#xff1a;这…

KingbaseES:一体化架构与多层防护,支撑业务的持续稳定运行与扩展

声明&#xff1a;文章为本人真实测评博客&#xff0c;非广告 目录 引言 一、什么是KingbaseES&#xff1f; 二、KingbaseES核心特性 1. 一键迁移&#xff0c;极速性能&#xff0c;安全无忧​ 2. 性能强劲&#xff0c;扩展性强&#xff0c;助力企业应对大规模并发挑战​ …

scikit-learn/sklearn学习|广义线性回归 Logistic regression的三种成本函数

【1】引言 前序学习进程中&#xff0c;已经对线性回归和岭回归做了初步解读。 实际上&#xff0c; Logistic regression是一种广义的线性模型&#xff0c;在对线性分类的进一步学习前&#xff0c;有必要了解 Logistic regression。 【2】Logistic regression的3种成本函数 …

Tiptap(基于 Prosemirror)vs TinyMCE:哪个更适合你的技术栈?

在这之前&#xff0c;先来介绍一下 ProseMirror&#xff1a; 1. ProseMirror 是底层内核 定位&#xff1a;一个强大的 富文本编辑框架/引擎&#xff0c;不是一个成品编辑器。 作者&#xff1a;Marijn Haverbeke&#xff08;CodeMirror 作者&#xff09;。 核心思想&#xff1…

多墨智能-AI一键生成工作文档/流程图/思维导图

本文转载自&#xff1a;多墨智能-AI一键生成工作文档/流程图/思维导图 - Hello123工具导航 ** 一、AI 文档与视觉化创作助手 多墨智能是一款基于人工智能的在线工具&#xff0c;支持一键生成专业文档、流程图与思维导图&#xff0c;通过关键词输入快速完成内容创作&#xff0…

Kafka_Broker_副本基本信息

Kafka副本作用&#xff1a;提高数据可靠性 Kafka默认副本1个&#xff0c;生产环境一般配置为2个&#xff0c;保证数据可靠性&#xff0c;太多副本会增加磁盘存储空间&#xff0c;增加网络上数据传输&#xff0c;降低效率 Kafka中副本分为&#xff1a;Leader和Follower&#xff…