如何按行数上限与客户唯一性拆分百万行Excel文件?技术求助
Excel文件按客户完整性拆分(单文件不超10000行)
问题背景
现有120万行数据的.xlsx文件,需要拆分为单文件最大行数不超过10000的小文件,核心要求是同一客户的所有发票数据不能拆分到多个文件。例如当某个客户的部分数据刚好处于10000行临界点时,需将该客户的全部数据归入下一个文件。当前使用的Pandas代码仅能按固定行数拆分,无法满足客户数据完整性要求。
实现思路
- 读取完整的原Excel数据(若内存压力过大,可改用分块读取并跟踪客户边界,本文以全量读取为例)
- 按客户标识列(
ObchodnyPartner)分组,确保同一客户的所有数据连续 - 逐组累加行数,当累加后总长度超过10000行时,将当前已累加的所有组导出为一个文件,重置累加器后继续处理剩余组
- 处理最后剩余的未导出数据
完整实现代码
import os from pathlib import Path import pandas as pd root_path = "你的根路径" month_folder = "你的月份文件夹" url = "输出文件夹名称" rows_limit = 10000 # 单文件最大行数 header = ['Zmluva','UcOk','SU','Odb.miesto','ZmluvnuUcet','ObchodnyPartner','ZacZucObd','Kon.zuc.ob','C.zuct.dokl','Tlac.dokl','DrZuct','FaktPosSluz','FaktObl','OdpJedn','SU','TypTarify','Tarifa','Sk.faktov', 'EIC','Mesiac'] # 遍历目标文件夹下的所有xlsx文件 for file in Path(os.path.join(root_path, month_folder)).glob('*.xlsx'): in_xlsx = file file_name = os.path.basename(file) base_name = os.path.splitext(file_name)[0] output_dir = os.path.join(root_path, url) os.makedirs(output_dir, exist_ok=True) # 确保输出文件夹存在 # 读取完整数据并指定表头 df = pd.read_excel(in_xlsx, header=None, names=header) # 按客户分组,保留原始数据顺序 customer_groups = df.groupby('ObchodnyPartner', sort=False) current_chunk = [] current_row_count = 0 file_index = 0 for customer, group in customer_groups: group_row_count = len(group) # 检查加上当前客户组后是否超过行数限制 if current_row_count + group_row_count > rows_limit and current_row_count > 0: # 导出当前积累的chunk chunk_df = pd.concat(current_chunk, ignore_index=True) out_file = os.path.join(output_dir, f"{base_name}_{file_index}.xlsx") chunk_df.to_excel(out_file, index=False, header=True) # 重置chunk和计数,将当前客户组作为新chunk的起始 current_chunk = [group] current_row_count = group_row_count file_index += 1 else: # 将当前客户组加入chunk current_chunk.append(group) current_row_count += group_row_count # 导出最后剩余的chunk if current_chunk: chunk_df = pd.concat(current_chunk, ignore_index=True) out_file = os.path.join(output_dir, f"{base_name}_{file_index}.xlsx") chunk_df.to_excel(out_file, index=False, header=True)
关键代码说明
- 分组逻辑:使用
groupby('ObchodnyPartner', sort=False)保证客户的原始顺序不变,避免打乱数据原有排列 - 行数判断:每次添加客户组前检查总长度,若超过限制则先导出当前已积累的内容,再将当前客户组作为新chunk的起始
- 输出处理:自动创建输出文件夹,文件命名采用
原文件名_索引.xlsx的格式,确保文件名清晰唯一
内容的提问来源于stack exchange,提问作者Witchery
相关产品推荐
相关产品推荐

