使用Python处理大型XLSX文件

8
我有一个非常大的xlsx Excel文件(56mb,550k行),我试图读取前10行。我尝试使用xlrd,openpyxl和pyexcel-xlsx,但它们总是需要超过35分钟,因为它会将整个文件加载到内存中。
我解压缩了Excel文件,发现包含所需数据的xml文件未压缩时为800mb。
当您在Excel中加载相同的文件时,只需要30秒钟。我想知道为什么在Python中需要那么长时间?

2
这在 openpyxl 文档中有详细介绍。 - Charlie Clark
https://dev59.com/AFoT5IYBdhLWcg3wvRpk - dot.Py
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Charlie Clark
3个回答

6

我已经做过了,但它会在开始逐行读取之前将整个文件加载到内存中。 - Amine
1
不,它不会将整个文件读入内存。可能你没有正确使用它。 - Charlie Clark

4

这里有一个解决方案。读取xlsx表格的最快方式。

一个大小为56MB,包含500,000行和4个工作表的文件只需要6秒钟即可处理完毕。

import zipfile
from bs4 import BeautifulSoup

paths = []
mySheet = 'Sheet Name'
filename = 'xlfile.xlsx'
file = zipfile.ZipFile(filename, "r")

for name in file.namelist():
    if name == 'xl/workbook.xml':
        data = BeautifulSoup(file.read(name), 'html.parser')
        sheets = data.find_all('sheet')
        for sheet in sheets:
            paths.append([sheet.get('name'), 'xl/worksheets/sheet' + str(sheet.get('sheetid')) + '.xml'])

for path in paths:
    if path[0] == mySheet:
        with file.open(path[1]) as reader:
            for row in reader:
                print(row)  ## do what ever you want with your data
        reader.close()

享受并快乐编码。


3
这并不会“读取”文件,只是在 XML 上进行迭代。在读取 Excel 文件时,大部分时间都花在将 XML 转换为相关的 Python 结构上。 - Charlie Clark

-3

你所经历的加载时间直接与内存芯片的io速度有关。

pandas加载Excel文件时,它会制作文件的几个副本--因为文件结构没有序列化(Excel使用二进制编码)

关于解决方案:我建议通过以下方式解决:

  • 通过专门的硬件虚拟机(这里是AWS提供的内容)加载您的Excel文件
  • 将文件保存为csv格式以供本地使用。
  • 为了获得更好的性能,请使用优化的数据结构,例如parquet

要深入了解,请查看我写的文章:在Python中加载超大型Excel文件


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接