使用Pandas拆分单个大XLS文件生成多个CSV文件时仅生成单个小文件的问题求助
解决Pandas拆分XLS到CSV仅生成单个文件的问题
我帮你排查了这段代码,核心问题和优化点如下:
核心问题:文件名未动态更新
你把输出文件名o_filename定义在了循环外面,而且循环过程中没有更新它。这就导致所有分块数据都写入了同一个文件,后面的chunk会直接覆盖前面的内容,最终只保留最后一个分块的文件,所以你看到的是一个“小文件”(其实就是最后一个分块的大小)。
其他优化点
- 大文件内存优化:直接用
pd.read_excel()全量读取大XLS文件会占用大量内存,建议改用chunksize参数分块读取,更高效。 - 异常信息完善:原代码的异常处理仅打印“Exception: ”,没有输出具体错误详情,出问题时无法定位原因,建议补充打印异常信息。
- 路径和文件名逻辑优化:确保每个分块的文件名唯一,并且输出路径提前检查是否存在,避免因目录不存在导致写入失败。
修改后的完整代码
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
相关产品推荐
相关产品推荐

