在python中读取非常大的xlsx文件

时间:2017-11-12 13:33:47

标签: python excel bigdata

我需要读取xlsx文件300gb。行数~10 ^ 9。我需要从一列中获取值。文件由8列组成。我想尽快做到这一点。

from openpyxl import load_workbook
import datetime
wb = load_workbook(filename="C:\Users\Predator\Downloads\logs_sample.xlsx", 
read_only=True)
ws = wb.worksheets[0]

count = 0
emails = []
p = datetime.datetime.today()
for row in ws.rows:
   count += 1
   val = row[8].value
   if count >= 200000: break
   emails.append(val)
q = datetime.datetime.today()
res = (q-p).total_seconds()
print "time: {} seconds".format(res)
emails = emails[1:]

现在循环需要~16秒才能读取200.000行。时间复杂度为O(n)。因此,对于10 ^ 6行将近1.5分钟读取。比特我们有10 ^ 9。为此,我们必须等待10 ^ 3 * 1.5 = 1500分钟= 25小时。太糟糕了...... 求助我,解决这个问题。

2 个答案:

答案 0 :(得分:0)

要有效地运行此类任务,您需要使用数据库。 Sqlite可以在这里为您提供帮助。

  

使用来自http://pandas.pydata.org/和sqlite的pandas   http://sqlite.org/

您可以安装pandas;来自Continuum的pip或conda。

import pandas as pd
import sqlite3 as sql

#create a connection/db
con = sql.connect('logs_sample.db')

#read you file
df = pd.read_excel("C:\\Users\\Predator\\Downloads\\logs_sample.xlsx")

#send it to the db
pd.to_sql('logs_sample',con,if_exists='replace')

查看更多内容,http://pandas.pydata.org

答案 1 :(得分:0)

一种可能的选择是直接阅读.xml内的.xslx数据。

.xlsx实际上是一个zipfile,包含多个xml文件。

所有不同的电子邮件都可以在xl/sharedStrings.xml中,因此您可以尝试在那里提取它们。

要测试(使用较小的文件):将'.zip'添加到文件名并查看内容。

当然,解压缩整个300GB文件不是一个选项,因此您必须流式传输压缩数据(zip中的单个文件),解压缩内存中的部分并提取所需的数据。

我不懂Python,所以我无法提供代码示例。

另外:emails.append(val)将创建一个包含10亿个项目的数组/列表。将这些值直接写入文件而不是将它们存储在数组中(这将不得不增长并重新分配内存)可能会更好每次)。