Python怎么自动拆分包含几十万行数据的Excel表
用 pandas.read_excel 直接读几十万行 Excel 易卡死或爆内存,因默认加载全表 XML 结构;应优先转 CSV 后分块读取,或用 openpyxl 只读模式迭代切片写入。
用 pandas.read_excel 直接读几十万行 Excel 会卡死或爆内存
Excel 文件(尤其是 .xlsx)本质是 ZIP 压缩包,含 XML 结构,pandas.read_excel 默认用 openpyxl 引擎加载时会把整张表解析进内存——哪怕只取前 10 行,它也得先解压、解析所有 sheet 的 XML 节点。几十万行 + 多列 + 公式/样式,很容易触发 MemoryError 或耗时几分钟无响应。
实操建议:
- 改用
xlrd(仅支持.xls)或openpyxl的流式读取模式(但pandas不支持流式读 Excel)——所以得绕开read_excel - 优先转成
.csv:用 Excel 手动另存为 CSV,或用openpyxl/xlrd逐行读写到 CSV,再用pandas.read_csv分块读 - 若必须保留在 Excel 格式中拆分,就别用 pandas 加载全量,直接用底层库按行切片
用 openpyxl 迭代读取并分批写入新 Excel
适用于需保留格式(如字体、合并单元格)或必须输出为 .xlsx 的场景。核心是不用 worksheet.iter_rows() 加载全部数据,而是用 worksheet.iter_rows(values_only=True) 配合 max_row 控制范围,再用新工作簿逐批写入。
示例逻辑(不加载全表):
from openpyxl import Workbook from openpyxl.reader.excel import load_workbookwb_in = load_workbook("big.xlsx", read_only=True) ws = wb_in.active
batch_size = 50000 row_count = 0 batch_num = 1 wb_out = Workbook() ws_out = wb_out.active
for row in ws.iter_rows(values_only=True): ws_out.append(row) row_count += 1 if row_count >= batch_size: wbout.save(f"split{batch_num}.xlsx") batch_num += 1 wb_out = Workbook() ws_out = wb_out.active row_count = 0
写入剩余行
if row_count > 0: wbout.save(f"split{batch_num}.xlsx")
wb_in.close()
注意点:
-
load_workbook(..., read_only=True)是关键,否则仍会内存暴涨 -
values_only=True跳过样式/公式,只取值;若需保留格式,就不能用read_only,此时应换用xlwings(需本地 Excel 进程,慢但保真) - 每写完一个文件要调用
wb_out.save()并新建Workbook(),否则内存持续累积
用 pd.read_csv 分块读 + to_excel 输出,速度最快且可控
绝大多数“自动拆分”需求其实不依赖 Excel 原生格式——CSV 更轻、读写更快、分块天然支持。只要原始 Excel 能转成 CSV(通常可接受),这是最稳的路径。
操作步骤:
Fig
下一代命令行工具,内置AI终端命令自动补全
- 先用 Excel 或脚本把
big.xlsx另存为big.csv(注意编码选 UTF-8,避免中文乱码) - 用
pandas.read_csv(..., chunksize=N)流式读取,N 设为 20000–100000(根据内存调整) - 每个
chunk直接to_excel("out_{}.xlsx".format(i), index=False)
示例:
import pandas as pdfor i, chunk in enumerate(pd.read_csv("big.csv", chunksize=65535)): chunk.toexcel(f"chunk{i+1}.xlsx", index=False)
为什么选 65535?
- Excel 2007+ 单表行数上限是 1048576,留余量便于后续追加或人工处理
- 超过 10 万行时
to_excel写入速度明显下降(openpyxl底层开销增大) - 小于 5 万则生成文件过多,管理成本上升
拆分后文件名和路径容易出错,尤其含中文或空格
Windows 下路径含中文、空格、括号(如 C:我的数据报表(终版).xlsx)会导致 openpyxl 或 pandas 报 FileNotFoundError 或编码错误,不是数据问题,是路径没被正确转义。
安全做法:
- 统一用正斜杠
/或双反斜杠\,避免单反斜杠(会被当制表符) - 路径用
os.path.abspath()或pathlib.Path规范化,例如:Path("输入/大表.xlsx").resolve() - 文件名避开
: " / | ? *和尾部空格,用re.sub(r'[^w.-]', '_', name)清洗 - 如果涉及网络路径(如
\servershare),务必测试os.path.exists()是否返回True,否则静默失败
真正卡住人的往往不是算法,而是第 3 个文件因路径里有个隐藏的全角空格没识别出来,导致后续全白跑。
如非特殊说明,本站内容均来自于网友自主分享,如有任何问题均请联系我们进行处理!
猜您喜欢
男孩玩火烧光几十万手机 爸爸淡定教育玩火危害
2026-06-22近日,广东。一名5岁男孩在家中玩火,意外引发火灾,家中环境被烧得面目全非,其中屋内价值数几十万元的手机货物全部损毁,损失惨重。面对突如其来的巨额损失,孩子爸爸的处理方式却格外平静。 他没有暴怒斥责、打骂孩子,而是平静地反问孩子“开不开心”,随后耐心平和地教导孩子,让他明白何为“玩火自焚”,知晓玩火的严重危害。 谈及自己不打骂孩子的原因,这位爸爸解释称,自己的孩子平日里十分懂事乖巧,3岁时就会主动帮...
如何修复Python aiohttp请求时出现的ClientPayloadError?
2026-06-04ClientPayloadError表明服务端提前关闭连接,非客户端代码错误;常见于服务端超时、拒绝大响应或代理截断,需通过抓包、检查响应头、服务端日志及添加读取超时和异常处理来定位解决。 ClientPayloadError通常意味着服务端提前关闭了连接 这个错误不是客户端代码写错了,而是aiohttp在读取响应体时发现服务端已经断开了连接。常见于服务端超时、主动拒绝大响应、或代理/网关(如Ng...
如何使用Python监控服务器CPU温度并邮件告警_通过psutil模块读取系统信息
2026-06-04psutil无法直接读取CPU温度,因其依赖系统硬件接口且Linux需lm_sensors支持、Windows/macOS完全不支持;可靠方式是用subprocess调用sensors命令解析输出,并配合邮件告警与健壮性设计。 psutil本身不提供CPU温度读取功能——它无法直接获取温度传感器数据,强行调用psutil.sensors_temperatures()在多数Linux发行版(尤其是无...
如何在Python中验证文件的MD5校验和以确保数据完整性?
2026-06-04必须分块读取,推荐8192或65536字节块大小,以rb模式打开文件,循环调用update(),最后用hexdigest()获取32位小写十六进制字符串;校验时需strip().lower()统一格式并做长度校验。 用hashlib.md5()读取文件并计算校验和 直接调用hashlib.md5()并传入整个文件内容(比如md5.update(f.read()))在大文件上会爆内存。必须分块读取,...
怎样在Python Tkinter中使用线程池处理高并发的GUI数据更新?
2026-06-04不能直接用ThreadPoolExecutor更新Tkinter控件,因为Tkinter的Tcl解释器只允许主线程操作UI;子线程(包括线程池中的工作线程)调用widget方法会引发TclError或卡死;必须通过queue.Queue+root.after()将结果安全传回主线程更新。 为什么不能直接用concurrent.futures.ThreadPoolExecutor更新Tkinter控...
如何在Python 3中正确判断一个对象是否为某个类的实例?
2026-06-04应优先使用isinstance()而非type()做类型判断,因isinstance()遵循MRO、支持继承与ABC,体现鸭子类型哲学;type()仅判别直接类型,适用极少数需严格身份校验的场景。 用isinstance()而不是type() 直接比较type(obj)==SomeClass在绝大多数场景下是错的——它无法识别子类实例。比如isinstance(42,int)返回True,但typ...
为什么Python Django默认使用PBKDF2算法进行密码哈希?
2026-06-04Django默认使用PBKDF2而非Argon2或bcrypt,因其零依赖、NIST合规、迭代与salt可扩展,且默认26万次迭代兼顾安全与性能;make_password和check_password均动态读取PASSWORD_HASHERS[0],支持渐进式算法迁移。 PBKDF2是Django默认密码哈希算法,因为它在安全性、兼容性与可配置性之间取得了最务实的平衡。 为什么不是更“新”的Ar...
如何在Python中自定义NumPy的打印格式以方便调试?
2026-06-04np.set_printoptions()可直接控制NumPy数组显示格式;默认格式因小数位不一致、科学计数法混用及自动截断而影响调试效率;关键参数需协同设置,如precision控制有效位数、suppress禁用科学计数法、threshold避免省略、linewidth防换行混乱、floatmode='fixed'统一小数位;调试时应按目标切换组合,并注意全局生效与及时还原。 直接用np.set...
如何使用Python自动化同步GitLab与GitHub代码_利用Subprocess调用指令
2026-06-04直接用subprocess调用git命令同步GitLab和GitHub是轻量、可控、不依赖第三方库的可靠方案,核心三步:裸克隆→添加远程→gitpush--mirror,支持全分支、标签及完整历史同步,且避免API封装带来的繁琐遍历与权限管理。 直接用subprocess调用git命令同步GitLab和GitHub,是轻量、可控、不依赖第三方库的可靠方案。它绕开了API权限配置、token管理和网...
如何创建一个每天定时向 Telegram 群组发送消息的独立机器人
2026-06-04telegram机器人本身不具备“自动唤醒”或“离线执行”能力,必须持续运行在一台24/7在线的服务器上;本地电脑关机即停止发送,需借助云平台(如pythonanywhere、heroku或vps)实现真正的每日定时推送。 telegram机器人本身不具备“自动唤醒”或“离线执行”能力,必须持续运行在一台24/7在线的服务器上;本地电脑关机即停止发送,需借助云平台(如pythonanywhere、...
