【问题标题】:reading 300k cells in excel using read_only in openpyxl not enough在 openpyxl 中使用 read_only 在 excel 中读取 300k 单元格还不够
【发布时间】:2016-04-13 18:30:09
【问题描述】:

我在这里阅读了很多关于使用 openpyxl 和 load_workbook() 中的 read_only 参数读取大型 excel 文件的问题,并且我已经使用 source excels 50x30 成功完成了它,但是当我尝试在带有 30x1100 工作表的工作簿,它会停止。现在,它只是读取excel并将其传输到多维数组中。

from openpyxl import Workbook
from openpyxl import load_workbook


def transferCols(refws,mx,refCol,newCol,header):
    rmax = refws.max_row

    for r in range(1, rmax+1):
        if (r == 1):
            mx[r-1][newCol-1] = header
        else:
            mx[r-1][newCol-1] = refws.cell(row = r, column = refCol).value


    return

ref_wb = load_workbook("UESfull.xlsx", read_only= True)
ref_ws = ref_wb.active 
rmax = ref_ws.max_row

matrix = [["fill" for col in range(30)] for row in range(rmax)]
print("step ", 1)
transferCols(ref_ws,matrix,1,1,"URL")
...

我只放了 print("step") 行来跟踪进度,但令人惊讶的是,它停在第 1 步!我只是不知道结构是否很差,或者 300k 单元对于 openpyxl 来说是否太多了。我什至还没有开始写我的put excel!提前致谢!

【问题讨论】:

  • 如果您使用文档中的basic read-only example,它是否也无法打印任何内容?如果它是/是一个简单的 2D 表,我可能只是在 Microsoft Office 中保存为 CSV 并在 python 中逐行读取它
  • 读完数据后打算做什么?您可能有pandas 的解决方案
  • 嗨@Abbas,感谢参与!我真的被困在这里了。我需要读取一个大的 2D excel 表,清理数据,使所有条目都采用统一格式,然后保存。很简单,但资源密集?后续代码只是对 transferCols() 的多次调用。我认为阅读 Excel 并将其存储在本地 2D 矩阵中,同时在将其写入 Excel 之前对其进行编辑会更快。
  • 我还应该说我的代码适用于精确源 Excel 的较小版本。只有当我在大型 Excel(格式和数据单元格相同)上运行它时,程序才会停止。

标签: excel python-3.x openpyxl


【解决方案1】:

我怀疑您的工作表没有尺寸,所以 ws.max_row 是未知的。如果是这种情况,使用ws.calculate_dimensions() 会告诉你,那么你应该并行遍历两张表的行。

【讨论】:

  • 当我运行测试行 print(ws._calculate_dimension()) 我得到 Traceback(最近一次调用最后):文件“/XLCleaner.py”,第 319 行,在 print(ref_ws ._calculate_dimension()) 文件“/lib/python3.5/site-packages/openpyxl/worksheet/read_only.py”,第 214 行,_calculate_dimension max_col = max(max_col, cell.column) TypeError: unorderable types: NoneType() > int() 奇怪的是 ws.max_row 从 excel 表返回适当数量的行 - 11,000。当我简单地删除所有行以保留 50 行时,程序会按广告运行。
  • 看起来可能是损坏的文件。您不能从只读文件中删除行,所以我不知道您的意思。在任何情况下,只要 11,000 行,您就可以很好地将所有内容保存在内存中。或者重写您的代码以使用ws.iter_rows()。我无法理解您的代码。
  • 对不起,我应该更清楚。我的意思是,为了测试我的代码,我手动进入 MS Excel 并删除了行以减少负载。一旦我验证我的代码有效,我就在 11,000 行的原始 excel 表上运行它 - 它停滞不前。 @查理克拉克。我很感激尝试
  • 好吧,Excel 将重新计算工作表尺寸,因此 openpyxl 可以使用。如果您查看相关文件的来源,尺寸标签可能不完整或丢失。从您的描述中听起来不完整。
  • 谢谢@Charlie Clark。你的意思是从 Python 中寻找尺寸(maxrows,max columns),还是在 excel 中有一些我不知道的尺寸标签? ws.max_rows 和 ws.max_columns 返回适当的数量。我真的很感谢你坚持这个哈哈。
【解决方案2】:

不要尝试在openpyxl 中读取大型excel,而是尝试pandas 会得到更好的结果。 pandas 有更好的功能来清理你应该做的数据。

这是一个在 pandas 中写入和读取的 10000 行和 30 列数据的示例:

import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(10000,30))
df.to_excel('test.xlsx')
df1 = pd.read_excel('test.xlsx')

【讨论】:

  • Pandas 内部使用xlrd 库来读取 Excel 文件。根据您想要做什么,这是其中一种情况,openpyxl 的只读模式更适合。
  • @CharlieClark 而openpyxl 只读模式更适合,OP 无法使用 300K+ 单元格读取他/她的 excel,而这是显示 pandas 如何与阅读一起工作的示例30 万个细胞。
  • 不,读取文件没有问题,这里的大小不相关。使用的代码依赖于一个可选的优化,它将工作表的尺寸放在 XML 的开头。如果缺少它,那么事实上您无法使用它,但仍然可以读取单元格。另外,如上所述:openpyxl 可以轻松处理内存中的 300k 单元。
猜你喜欢
  • 1970-01-01
  • 2018-12-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-12
  • 1970-01-01
  • 1970-01-01
  • 2019-07-08
相关资源
最近更新 更多