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

使用Pandas拆分单个大XLS文件生成多个CSV文件时仅生成单个小文件的问题求助

解决Pandas拆分XLS到CSV仅生成单个文件的问题

我帮你排查了这段代码,核心问题和优化点如下:

核心问题:文件名未动态更新

你把输出文件名o_filename定义在了循环外面,而且循环过程中没有更新它。这就导致所有分块数据都写入了同一个文件,后面的chunk会直接覆盖前面的内容,最终只保留最后一个分块的文件,所以你看到的是一个“小文件”(其实就是最后一个分块的大小)。

其他优化点

  1. 大文件内存优化:直接用pd.read_excel()全量读取大XLS文件会占用大量内存,建议改用chunksize参数分块读取,更高效。
  2. 异常信息完善:原代码的异常处理仅打印“Exception: ”,没有输出具体错误详情,出问题时无法定位原因,建议补充打印异常信息。
  3. 路径和文件名逻辑优化:确保每个分块的文件名唯一,并且输出路径提前检查是否存在,避免因目录不存在导致写入失败。

修改后的完整代码

import os
import math
import datetime
import pandas as pd

def xls_split_to_csv(sourceFilePath):
    curr_date = datetime.datetime.now().strftime("%d-%m-%Y")
    curr_time = datetime.datetime.now().strftime("%H-%M-%S")
    # 确保输出目录存在,不存在则创建
    output_dir = '../TruncatedFile'
    if not os.path.exists(output_dir):
        os.makedirs(output_dir)
    
    try:
        logMessage("--------------------------------------------------------")
        logMessage(f'######### Split engine started - {curr_date} ##########')
        logMessage("--------------------------------------------------------")
        chunk_size = config_params['split_size']
        batch = 0
        
        # 改用chunksize分块读取大文件,降低内存占用
        reader = pd.read_excel(sourceFilePath, chunksize=chunk_size)
        # 获取总文件数(先估算总行数)
        with pd.ExcelFile(sourceFilePath) as xls:
            total_rows = pd.read_excel(xls, sheet_name=0).shape[0]
        file_count = math.ceil(total_rows / chunk_size)
        
        for chunk in reader:
            batch += 1
            logMessage(f'Splitting file ----> ({batch} of {file_count})')
            # 循环内动态生成唯一文件名
            o_filename = f'file_{curr_date}_{curr_time}_{batch}.csv'
            output_path = os.path.join(output_dir, o_filename)
            chunk.to_csv(output_path, index=False, header=True)
            
        logMessage("--------------------------------------------------------")
        logMessage(f'######### Split completed successfully! Generated {file_count} files. ##########')
        logMessage("--------------------------------------------------------")
        
    except ZeroDivisionError as zeroEx:
        logError(f"ZeroDivisionError Exception: {str(zeroEx)}")
    except Exception as ex:
        logError(f"General Exception: {str(ex)}")

关键修改说明

  • 将o_filename的生成移到了循环内部,每次循环根据batch数生成唯一文件名,避免覆盖。
  • 添加了输出目录检查与创建逻辑,防止因目录不存在导致写入失败。
  • 改用pd.read_excel(chunksize=...)分块读取文件,适合处理大文件,减少内存压力。
  • 完善了异常处理,打印具体的错误信息,方便排查问题。
  • 调整了batch的计数逻辑,让输出的文件序号从1开始更合理。

内容的提问来源于stack exchange,提问作者Asif Iqbal

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 20:42:49