使用openpyxl写入500k+行的内存错误

2024-05-22 00:56:11 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个脚本,它使用openpyxl打开一个xlsx模板文件,然后在6个工作表中创建一个,从脚本中先前生成的列表中添加一些数据,并更改单元格的格式。在

我遇到的问题是,在一张纸上,我需要写9列500k+行,这给了我一个MemoryError。在

Traceback (most recent call last):
  File "C:\python27\labs\labs\sqrdist\new_main_ui.py", line 667, in request_and_send_reports
    x = sqr_pull.main()
  File "C:\Python27\lib\site-packages\memory_profiler-0.32-py2.7.egg\memory_profiler.py", line 801, in wrapper
    val = prof(func)(*args, **kwargs)
  File "C:\Python27\lib\site-packages\memory_profiler-0.32-py2.7.egg\memory_profiler.py", line 445, in f
    result = func(*args, **kwds)
  File "C:\python27\labs\labs\sqrdist\sqr_pull.py", line 327, in main
    os.remove(temp_attach_filepath)
  File "build\bdist.win32\egg\openpyxl\workbook\workbook.py", line 281, in save
  File "build\bdist.win32\egg\openpyxl\writer\excel.py", line 214, in save_workbook
  File "build\bdist.win32\egg\openpyxl\writer\excel.py", line 197, in save
  File "build\bdist.win32\egg\openpyxl\writer\excel.py", line 109, in write_data
  File "build\bdist.win32\egg\openpyxl\writer\excel.py", line 134, in _write_worksheets
  File "build\bdist.win32\egg\openpyxl\writer\worksheet.py", line 281, in write_worksheet
  File "build\bdist.win32\egg\openpyxl\writer\worksheet.py", line 381, in write_worksheet_data
  File "build\bdist.win32\egg\openpyxl\writer\worksheet.py", line 404, in write_cell
  File "build\bdist.win32\egg\openpyxl\xml\functions.py", line 142, in start_tag
  File "C:\Python27\lib\xml\sax\saxutils.py", line 159, in startElement
    self._write(u' %s=%s' % (name, quoteattr(value)))
  File "C:\Python27\lib\xml\sax\saxutils.py", line 104, in write
    self.flush()
MemoryError

我认为引起这种情况的代码如下,KeywordReport是一个列表列表。在

^{pr2}$

我已经看了http://openpyxl.readthedocs.org/en/latest/optimized.html但是我不认为我可以使用它来编写而不直接将其转储到新的工作簿中,但是我需要现有模板中的数据。在

有办法吗?在


Tags: inpybuildeggliblinefilewrite
1条回答
网友
1楼 · 发布于 2024-05-22 00:56:11

50万行应该不是什么大问题。但我想这也取决于你有多少份工作表。系统上有多少内存?在

安装lxml会更快(创建循环之外的任何样式),但我不希望它会降低内存使用量。在

如果您想使用工作簿中的现有数据来减少对现有数据的读取和写入,您可能会认为这两种方法都需要使用工作簿中的副本。进一步的讨论可能是最好的邮件列表。在

相关问题 更多 >