Python中CSV转XLSX的性能优化问题求助
CSV转XLSX性能优化问题
我用以下代码实现CSV文件转XLSX文件:
import glob import csv from xlsxwriter.workbook import Workbook def create_excel_file_from_csv(csv_file_path, new_file_path): """Create an Excel file from a CSV file""" for csvfile in glob.glob(csv_file_path): workbook = Workbook(new_file_path, {'constant_memory': True,'strings_to_numbers':False}) workbook.use_zip64() worksheet = workbook.add_worksheet() with open(csvfile, 'rt', encoding='utf8') as f: reader = csv.reader(f) for r, row in enumerate(reader): for c, col in enumerate(row): worksheet.write(r, c, col) workbook.close()
测试情况:
- 61MB、18列438000行的CSV:转换耗时3分30秒,生成29MB XLSX
- 480MB、95列760000行的CSV:转换耗时30分钟,生成276MB XLSX
请问如何提升转换性能?更换其他包或方法也可接受。
优化方案
一、对原xlsxwriter代码的针对性优化
- 替换逐单元格写入为整行写入:原代码逐单元格调用
worksheet.write()是核心性能瓶颈,改用worksheet.write_row()一次性写入整行,大幅减少函数调用次数:import glob import csv from xlsxwriter.workbook import Workbook def create_excel_file_from_csv(csv_file_path, new_file_path): for csvfile in glob.glob(csv_file_path): workbook = Workbook(new_file_path, {'constant_memory': True,'strings_to_numbers':False}) workbook.use_zip64() worksheet = workbook.add_worksheet() with open(csvfile, 'rt', encoding='utf8', buffering=1024*1024) as f: reader = csv.reader(f) for r, row in enumerate(reader): worksheet.write_row(r, 0, row) workbook.close() - 增大文件读取缓冲区:打开CSV时设置
buffering=1024*1024(1MB缓冲区),减少磁盘IO的系统调用次数。
二、更换为高性能库
1. 使用pandas(推荐)
pandas底层基于C优化的IO逻辑,批量处理效率远高于纯Python循环,同时支持分块读取避免内存溢出:
import pandas as pd def csv_to_xlsx_pandas(csv_file_path, new_file_path): chunk_size = 100000 # 按10万行分块读取 chunks = pd.read_csv(csv_file_path, chunksize=chunk_size, encoding='utf8') with pd.ExcelWriter(new_file_path, engine='xlsxwriter') as writer: for idx, chunk in enumerate(chunks): chunk.to_excel( writer, sheet_name='Sheet1', startrow=idx*chunk_size, index=False, header=(idx==0) # 仅第一块写入表头 )
该方案可将大文件转换时间压缩至原代码的1/5甚至更短。
2. 使用openpyxl批量写入
openpyxl的append()方法支持直接写入整行数据,API调用开销更低:
import glob import csv from openpyxl import Workbook def csv_to_xlsx_openpyxl(csv_file_path, new_file_path): for csvfile in glob.glob(csv_file_path): wb = Workbook() ws = wb.active with open(csvfile, 'rt', encoding='utf8', buffering=1024*1024) as f: reader = csv.reader(f) ws.append(next(reader)) # 写入表头 for row in reader: ws.append(row) wb.save(new_file_path)
超大文件可手动拆分批次写入,避免内存过载。
三、通用性能优化技巧
- 使用SSD存储:磁盘IO是大文件转换的核心瓶颈之一,SSD的读写速度远高于机械硬盘,可显著缩短耗时。
- 多核并行处理:如果是批量转换多个CSV文件,可使用
multiprocessing库并行处理,充分利用CPU多核资源。 - 关闭不必要的格式转换:保持
strings_to_numbers=False,避免额外的类型检测与转换开销。
内容的提问来源于stack exchange,提问作者Pingpong
相关产品推荐
相关产品推荐

