Python 读取 Excel 超大数据文件问题

2019-08-09 10:10:31 +08:00
joson1205  joson1205
一个交易记录数据 xlsx 文件,存在两个 Sheet,行数分别是 2w,15w,列数 45+左右,需要自动化生成一份报表,报表的数据由这两个 Sheet 交叉运算得出,目前做法是 xlrd 读取到内存然后 xlsxwriter 写入一个新的文件中.
因为某些原因,该交易记录的数据不能存入数据库里面,暂时只能以表格形式存放,每次读取的时候都很费时间,考虑分块读取,好像库并不支持,pandas 类的 chunksize,基本都是针对 CSV 文件,有没有更好的办法解决读取速度慢的问题??
9350 次点击
所在节点   Python  Python
36 条回复
sikariba
sikariba
2019-08-09 10:27:56 +08:00
xlsx 的 2 个 sheet 转成 2 个 csv ? xlsx 是二进制格式,没办法分块读
joson1205
joson1205
2019-08-09 10:30:47 +08:00
@sikariba 我转 CSV 过程中数据都要过一遍内存吧
The1D
The1D
2019-08-09 10:38:10 +08:00
解压之后读 xml ?
misaka19000
misaka19000
2019-08-09 10:38:32 +08:00
为什么不能保存到其它地方
1462326016
1462326016
2019-08-09 10:45:58 +08:00
试试 openpyxl ?
vest8
vest8
2019-08-09 10:51:50 +08:00
pywin32 试下
joson1205
joson1205
2019-08-09 10:56:59 +08:00
@1462326016 我认为 xlrd 单纯在读取速度上是比 openpyxl 快不少的.
@vest8 pywin32 没有用过,我查查资料,谢谢
PEIENYKYK
PEIENYKYK
2019-08-09 11:15:53 +08:00
插眼,看解决办法。
wqzjk393
wqzjk393
2019-08-09 11:19:15 +08:00
df = pd.read_excel(sheetname=None)
df1 = df[‘ Sheet1 ’]
df2 = df[‘ Sheet2 ’]
1 分钟之内就能读完了,不慢了吧。。
joson1205
joson1205
2019-08-09 11:26:20 +08:00
@wqzjk393 试过了,比较慢,我正常 xlrd 读取要 85 秒,pandas 将近 100 秒
joson1205
joson1205
2019-08-09 11:35:33 +08:00
@wqzjk393 纠正一下,刚检查测试代码的时候发现有点异常,重新对比了一下,没到 100 秒,不过也是和 xlrd 速度差不多的,在 85 秒左右
alexfu
alexfu
2019-08-09 11:37:08 +08:00
交易记录的话已有的 row 应该是不变的? 计算能不能改成增量式的?根据新加的行算出结果的变化量,记录上次的结果和两个文件的行数?
read_excel 可以选 backend 为 xlrd,另外有 skip_row 参数 应该能省去一些 parsing 的时间?
joson1205
joson1205
2019-08-09 11:49:40 +08:00
@alexfu 我拿到数据的时候属于一个核算节点,row 是固定的,基本不会有增删,没办法改成增量式计算,而且数据都是连续性的,skip_row 并不适用...
joson1205
joson1205
2019-08-09 12:36:48 +08:00
目前找到最快的办法是 xlwings,预先打开了 xlsx 文件,在几秒钟内就能读取完成!

import xlwings as xw
# 事先打开了 xlsx 文件,会直接返回这个文件对象
wb = xw.Book("demo.xlsx")
sht1 = wb.sheets["sht111"]
sht2 = wb.sheets["sht222"]

sht1_value = sht1.range('A2:AU140000').value
sht2_value = sht2.range('A2:AQ19000').value
snw
snw
2019-08-09 12:44:07 +08:00
直接用 VBA 读写呢?在文件打开的情况下,VBA 对 Range 与数组之间的读写操作非常快。
tzigone
tzigone
2019-08-09 12:45:52 +08:00
5 万记录以上,用数据库模式吧,其他的都会崩溃。不清楚 python 下的数据读取引擎,在 window 下,装个 ace 就很稳了,速度绝对第一,也不崩。
joson1205
joson1205
2019-08-09 12:59:40 +08:00
@snw vba 在运算方面实在太慢了
youthfire
youthfire
2019-08-09 13:13:59 +08:00
不能存入数据库,那肯定影响速度,否则 pandas+sqlite 是不错的选择。pandas 远快于 openpyxl 及 xlrd,另外 pyExcelerate 写入 xlsx 速度远快于 xlsxwriter,比 pandas 还快。
luban
luban
2019-08-09 14:20:56 +08:00
没有太好的办法,只能曲折,Excel 只是压缩格式的一种,可以解压开看看里面的结构
一是不用 excel,改用 csv,txt 等文本格式
二是解压后解析 xml,2007 及后的 xml 格式较规范

为什么要转换成解析文本的方式,因为文本可以逐行读取处理,再大的文件也不怕
大文件几十上百 M 的你自己用高配电脑打开都很慢的
joson1205
2019-08-09 14:32:07 +08:00
@youthfire 写入的代码目前比较完善,暂时不打算做改动,谢谢你的建议

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/590369

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX