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

将大型 CSV 文件按指定行数拆分到 Excel 的不同工作表中

import pandas as pd import os from tqdm import tqdm import openpyxl def split_csv_to_excel(csv_file_path, output_excel_path=None, rows_per_sheet=5000, chunk_size=10000): """ 将大型 CSV 文件按指定行数拆分到 Excel 的不同工作表中 优化版本,适用于处理数百万行的超大数据集 参数: csv_file_path: 输入 CSV 文件路径 output_excel_path: 输出 Excel 文件路径,默认为 CSV 同名文件 rows_per_sheet: 每个工作表包含的行数,默认为 5000 chunk_size: 每次读取的 CSV 行数,用于处理大文件 """ # 确定输出文件路径:如果未指定输出路径,则默认在原CSV文件名后加"_split.xlsx" if output_excel_path is None: base_name = os.path.splitext(csv_file_path)[0] # 提取CSV文件的基础名称(不含扩展名) output_excel_path = f"{base_name}_split.xlsx" # 构建输出Excel文件名 # 获取 CSV 文件的列名(表头):读取第一行并按逗号分割 with open(csv_file_path, 'r', encoding='utf-8') as f: # 以只读模式打开CSV文件,指定编码为utf-8 header = f.readline().strip().split(',') # 读取第一行,去除首尾空格后按逗号分割为列表 # 计算 CSV 文件总行数用于进度显示:遍历文件计数(减去表头行) total_rows = sum(1 for _ in open(csv_file_path, 'r', encoding='utf-8')) - 1 # 生成器表达式遍历文件每一行,每一行对应生成一个1;sum() 对所有的 1 求和计数,再减1排除表头 # 计算需要读取的总块数:总记录数除以每次读取的块大小,向上取整 total_chunks = (total_rows // chunk_size) + (1 if total_rows % chunk_size != 0 else 0) # 创建 Excel 工作簿并添加第一个工作表 wb = openpyxl.Workbook() # 创建一个新的Excel工作簿 current_sheet = 1 # 记录当前工作表编号,从1开始 ws = wb.active # 获取工作簿的活动工作表(默认创建的第一个工作表) ws.title = f'Sheet{current_sheet}' # 为当前工作表命名(如"Sheet1") # 写入表头:将CSV的列名写入Excel工作表的第一行 for col_idx, col_name in enumerate(header, 1): # 枚举列名,索引从1开始(Excel列索引从1开始) ws.cell(row=1, column=col_idx, value=col_name) # 在第1行、第col_idx列写入列名 current_row = 2 # 当前工作表的写入行(从第2行开始,因为第1行是表头) total_sheets = 1 # 记录总工作表数量,初始为1 # 使用 tqdm 显示进度条:按块读取CSV数据,每次读取chunk_size行 # pd.read_csv(..., chunksize=chunk_size)返回迭代器,每次生成一个DataFrame(数据块) for chunk in tqdm(pd.read_csv(csv_file_path, chunksize=chunk_size), total=total_chunks, desc="处理中"): # 遍历数据块中的每一行(_为索引,row为行数据) for _, row in chunk.iterrows(): # 当达到工作表最大行数时,创建新工作表 # 条件:当前行号 > 单表最大行数 + 1(+1是因为表头占1行) if current_row > rows_per_sheet + 1: ws = wb.create_sheet(title=f'Sheet{current_sheet}') # 创建新工作表并命名 # 写入表头到新工作表 for col_idx, col_name in enumerate(header, 1): ws.cell(row=1, column=col_idx, value=col_name) current_row = 2 # 重置当前行号为2(新工作表从第2行开始写数据) total_sheets += 1 # 总工作表数加1 # 将数据写入当前工作表:遍历行中的每一列值 for col_idx, value in enumerate(row, 1): # 枚举行数据,索引从1开始 ws.cell(row=current_row, column=col_idx, value=value) # 在当前行、对应列写入值 current_row += 1 # 当前行号加1,准备写下一行数据 # 保存工作簿到指定路径 wb.save(output_excel_path) # 打印处理结果信息 print(f"CSV 文件已成功拆分到 {output_excel_path}") print(f"共生成 {total_sheets} 个工作表,每个工作表包含最多 {rows_per_sheet} 条记录") # 使用示例:当脚本直接运行时执行以下代码 if __name__ == "__main__": # 指定 CSV 文件路径 csv_path = 're_byticket_spider.csv' # 调用函数进行拆分:对于300万条数据,建议增大chunk_size以提高效率 split_csv_to_excel(csv_path, rows_per_sheet=5000, chunk_size=50000)
http://www.jsqmd.com/news/496704/

相关文章:

  • 事件触发控制代码及其对应参考文献
  • 小型化设备精准调节方案:PKH30梯形丝杆模组(±0.05mm)非标定制技术解析与案例
  • 【C++笔记5】类和对象(构造函数、析构函数、拷贝构造函数、赋值运算符重载)
  • 2026年物流专线公司专业选型指南:工厂物流、大件货运与长途整车运输怎么选? - 品牌推荐官
  • 西门子S7-1200 PLC工业污水处理系统:基于博途V13sp1的WinCC画面组态与仿真报告
  • 追剪算法:让机械加工更智能
  • 天猫超市卡回收的简单方法,安心转让渠道推荐 - 京回收小程序
  • 春日桌搭新首选!ROG魔霸9 Mini:3L 迷你机身,塞下锐龙 9+RTX5070
  • 高级特性之dubbo超时机制及集群容错机制
  • comsol数值模拟。 金属合金凝固数值模拟,连铸过程数值模拟,相场流场温度场,坯壳厚度计算
  • burpsuite详细安装教程及功能讲解
  • 基于全阶磁链观测器的异步电机矢量控制
  • 3月17日打卡
  • AI 硬件隐私困境下的市场博弈与未来走向
  • 批量PPT处理工具
  • OpenCV 实战:多角度模板匹配(旋转不变性实现)
  • simulink仿真模型,同步电机死区补偿,自适应补偿,图一前面开了补偿,后面关了补偿,可以看...
  • Linux 的 cat 命令
  • 不同构型混合动力汽车模型及控制策略,包括P2、P1+P3、P2+P3、P1+P2+P4、P1+...
  • 智慧农业之102种农业害虫目标检测系统 yolo格式农业害虫图像识别系统(数据集+模型+界面) 第10568期
  • 2026年评价高的水帘柜公司推荐:pp喷淋塔/rco沸石转轮设备/不锈钢喷淋塔/催化燃烧设备/喷塑流水线/选择指南 - 优质品牌商家
  • COMSOL模型中的双活塞协作运动:从理论到实践
  • DAY 25
  • 2026年净化车间厂家哪家好?五大厂家最新权威推荐榜单出炉! - 深度智识库
  • NPC三电平并网逆变器闭环控制仿真 采用LCL滤波器。 包含锁相环,闭环控制器,驱动发生器
  • 一小时速通:微前端
  • 跟我学C++中级篇—std::shared_ptr的线程安全性分析
  • Matlab 模拟计算光纤 v参数 光纤模式数量 对应模式分布图 模式在纤芯能量占比 有效折射率计算
  • Qwen3-ForcedAligner-0.6B从零开始:开发者如何集成至现有语音处理流水线
  • 2026年洁净车间厂家权威推荐:技术实力与合规保障并重的TOP5精选 - 深度智识库