【问题标题】:Cannot copy large Excel file using Openpyxl无法使用 Openpyxl 复制大型 Excel 文件
【发布时间】:2021-01-13 09:19:06
【问题描述】:

我有一个 9000 行 x 30 列的 Excel 文件,其中包含我想从一个 Excel 工作簿复制到另一个工作簿的内容。然而,我面临的问题是,当我运行我的代码时,它永远不会停止运行。更重要的是,内存使用率一直在上升,直到它使用了我笔记本电脑可用内存的 90%-98% (screenshot)。

我尝试使用timeit 来查看我的代码有多慢,但即使这样也不会执行。我拒绝相信这是我的 Excel 文件的大小,所以它一定是我的代码的问题。我无法准确指出它可能是什么,因为我对openpyxl 的经验非常有限,因此非常感谢任何建议。我正在使用openpyxl 3.0.4Python 3.8.7

def copy(source, destination):
    # Open source workbook
    wb1 = load_workbook(source)
    ws1 = wb1.worksheets[0]

    # Open destination workbook
    wb2 = load_workbook(destination)
    ws2 = wb2.active

    # Get rows and columns of source
    max_rows = ws1.max_row
    max_columns = ws1.max_column

    # Copy cells from source to destination
    for i in range(1, max_rows + 1):
        for j in range(1, max_columns + 1):
            # Read from source
            c = ws1.cell(row=i, column=j)

            # Write to destination file
            ws2.cell(row=i, column=j).value = c.value

    # Save source
    wb2.save(str(destination))

copy_src = r"C:\Users\username\Documents\copy_from.xlsx"
copy_dst = r"C:\Users\username\Documents\copy_to.xlsx"
time = timeit.timeit('%s' % copy(copy_src, copy_dst))
print("Execution time for copy(): %f seconds" % time)

【问题讨论】:

  • 你可以访问这个:- stackoverflow.com/questions/44593705/…
  • 我已经尝试了答案中给出的解决方案,但它不起作用。同样的事情也会发生。内存在增加,它永远不会真正结束。
  • 9000x30 是 表。一张表最多可以有 1M 行。这段代码有什么意义呢? ws1.max_row 返回什么?您是否尝试复制 1M 行?为什么不使用for row in ws1: for cell in row:
  • 我尝试使用@KishanYadav 上面给出的解决方案,它使用for row in ws1: for cell in row:,但这似乎并没有解决我的问题。至于ws1.max_row 返回的内容,似乎即使是这样的简单代码:pastebin.com/kEUXQDvG 也不会运行。这表明 Excel 工作簿有问题,但我不确定是什么问题。我尝试按照建议的答案之一清除空白,但这并没有解决问题。
  • 我已尝试下载以下 .csv 文件(将其转换为 .xlsx):data.cityofnewyork.us/Business/Legally-Operating-Businesses/… 并运行上面发布的代码。完成执行仍需要一段时间(仍然不显示 max_rows),但尽管有时间,但它返回 0.007179,这对我来说似乎很奇怪。

标签: python python-3.x openpyxl


【解决方案1】:

工作表不大。如果工作簿是 261 MB(请在描述中包含此信息),那么它必须包含许多 openpyxl 正在读入内存的非常大的对象。对于复制来说,只读模式就足够了。

【讨论】:

    【解决方案2】:

    Excel 文件有多大?不是按行/列,而是按磁盘大小?每当我过去使用 openpyxl 时,我总是遇到“空的、格式化的单元格”的问题,您可以通过将 excel 文件打开为 XML 来更清楚地看到这些问题:(How to view the XML form of an Excel file?)。

    最简单的修复方法是打开源 excel 文件(在 Excel 中),选择所有空白单元格并使用工具栏中的“全部清除”按钮,或者直接点击删除通常也可以。

    【讨论】:

    • 文件大小为 261 MB。我尝试删除空白,但它似乎没有做任何事情。
    猜你喜欢
    • 2014-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-20
    • 1970-01-01
    相关资源
    最近更新 更多