You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 18:45:00