使用XLSX Writer将Pandas导出到Excel - 常量内存/内存中

5
我正在使用pandas和xlsxwriter在AWS Lambda中创建Excel报告。当创建大约60MB左右的Excel文件时,会发现磁盘空间填满,即使有512MB的可用磁盘空间也无法解决问题。
我一直在试图找出这是为什么,然后我发现了一个有希望的属性可以传递,即“constant_memory”,因此我尝试使用以下代码:
with pd.ExcelWriter(output, options={"constant_memory": True}) as writer:

看起来这确保了我的Lambda函数始终完成运行,如果我将其删除,则不再完成。但问题是,我会收到以下警告:

FutureWarning: Use of **kwargs is deprecated, use engine_kwargs instead.
    with pd.ExcelWriter(output, options={"constant_memory": True}) as writer:

我在Stack Overflow上读了一篇帖子,我认为这篇帖子是xlsxwriter作者提出的建议,在使用pandas时,该属性实际上并没有起作用。这在我的Excel报告中只显示第一列和最后一行的360000行数据,这似乎很明显。 我不清楚如何通过传递此属性来确保我的lambda函数完成操作,如果我不传递它,为什么我的lambda会耗尽磁盘空间?

第二个奇怪的事情是,pandas文档中根本没有提到任何名为options的参数,如果我尝试使用engine_kwargs传递constant_memory,则会出现问题:

with pd.ExcelWriter(output, engine_kwargs={'constant_memory': True}) as writer:

我遇到了以下错误:

TypeError: __init__() got an unexpected keyword argument 'constant_memory'

我希望对于xlsxwriter更为熟悉的人可以帮助我理解以下几点内容。

xlsxwriter的文档中还提到了一个属性"in_memory",似乎可以解决我的问题,但是我无法将其传递给pd.ExcelWriter。

TypeError: __init__() got an unexpected keyword argument 'in_memory'

编辑:将in_memory传递确实解决了我遇到的问题,但是使用kwargs options参数传递它会收到过时警告。

with pd.ExcelWriter(output, options={"in_memory": True}) as writer:

FutureWarning: Use of **kwargs is deprecated, use engine_kwargs instead.
    with pd.ExcelWriter(output, options={"in_memory": True}) as writer:

我该如何在使用pandas时将此属性传递给xlsxwriter而不会收到弃用警告,因为这似乎可以解决我的问题?
3个回答

4

我不是专家,无论如何,你尝试过了吗?

pd.ExcelWriter(output, engine_kwargs={'options': {"constant_memory": True}})

?


4

在收到弃用通知时将xlsxwriter选项传递给Pandas的正确语法是:

writer = pd.ExcelWriter('pandas_example.xlsx',
                        engine='xlsxwriter',
                        engine_kwargs={'options': {'strings_to_numbers': True}})

请参见 XlsxWriter文档的此部分
然而,正如您在问题中指出的,并从您的观察中得知,constant_memory选项与Pandas不兼容,因为它要求按行顺序编写数据,但是Pandas使用按列顺序编写数据。
但是,请明确一点,constant_memory选项仅会减少应用程序使用的“内存”量。 它不会使文件大小变小(实际上,如果它包含大量字符串数据,则通常会使文件变大)。 它可能只通过仅将一列数据写入文件来“解决”您的问题,从而使文件比预期的要小得多。

我发现 constant_memory 并没有解决我的问题,但是 in_memory 却可以。感谢你指出了错误的语法,不确定我怎么会错过它。 - berimbolo
1
你可能错过了,因为我上周才更新了文档,在看到几个与弃用通知相关的问题后才开始更新。 :-) - jmcnamara
1
另外,如果“in_memory”解决了您的问题,那很可能是因为xlsxwriter使用的临时文件占用了您无法看到的磁盘配额。 - jmcnamara

0
我不是专家,不过你试过直接使用xlsxwriter而不是pandas吗?
import xlsxwriter

workbook = xlsxwriter.Workbook('output.xlsx', {'strings_to_numbers': True, 'constant_memory': True, 'encoding': 'utf-8'})
worksheet = workbook.add_worksheet()

worksheet.write('A1', 'hello world')

workbook.close()

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