用pandas读取后按分组保存最稳,核心是groupby+to_excel拆分,需清洗文件名非法字符、去索引,大表加engine="openpyxl";保留样式基本不可行,固定行数拆分更轻量,注意路径权限和Excel进程占用。

直接用 pandas 读取再按分组保存最稳,别碰 openpyxl 循环复制——容易崩内存、丢失格式、慢三倍。
用 groupby + to_excel 拆分最快最可靠
适用于按某列(如“部门”“地区”“日期”)把一张表切分成多个文件,每个文件含对应全部行。核心是先 groupby,再遍历 groups 写文件。
- 确保目标列无空值,否则会生成一个叫
nan的文件夹或文件名出错 - 文件名里别直接拼
group_name,先用str(group_name).replace("/", "_")清洗非法字符 - 加
index=False避免写入多余的行号列 - 大表(>10万行)建议加
engine="openpyxl",不然默认xlsxwriter不支持追加写,也读不了已有样式
import pandas as pd
df = pd.read_excel("data.xlsx")
for name, group in df.groupby("部门"):
clean_name = str(name).replace("/", "_").replace("\", "_")
group.to_excel(f"部门_{clean_name}.xlsx", index=False)
拆分后保留原Excel样式?基本做不到
pandas 的 to_excel 只写数据,不带字体、合并单元格、条件格式。真要样式,只能退回到 openpyxl 手动操作,但代价很大:
librosa 是一个用于音频和音乐分析的 Python 库。它提供了特征提取、频谱分析、节拍跟踪、起始检测和音频可视化的工具,基于 NumPy 和 SciPy 构建,用于科学音频计算。
- 每拆一个文件都要
load_workbook原模板,再逐行复制数据——100个分组就是100次加载,IO爆炸 - 合并单元格、批注、图表等几乎无法准确还原
- 如果原始表本身没样式,其实没必要强求;有样式需求,建议源头改用数据库+报表工具导出
按行数固定拆分(比如每5000行一个文件)
适合日志类、流水类无逻辑分组的表,用 numpy.array_split 或纯 Python 切片更轻量:
- 别用
df.iloc[i:i+5000]在循环里反复索引,DataFrame 切片本身有开销 - 推荐先转
numpy数组再分块,或直接用range(0, len(df), 5000)控制起点 - 文件名用序号比用内容安全,例如
f"output_part_{i//5000 + 1}.xlsx"
import pandas as pd
df = pd.read_excel("log.xlsx")
chunk_size = 5000
for i in range(0, len(df), chunk_size):
chunk = df.iloc[i:i + chunk_size]
chunk.to_excel(f"output_part_{i//chunk_size + 1}.xlsx", index=False)
真正卡住的往往不是代码,而是路径权限、中文文件名编码、Excel 后台进程未释放导致的 PermissionError——跑之前先关掉所有 Excel 程序,输出目录用绝对路径,拆分前加一句 print(os.getcwd()) 确认当前位置。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










