【问题标题】:Pandas.ExcelWriter not behave the same after pyinstaller to exe filePandas.ExcelWriter 在 pyinstaller 到 exe 文件后的行为不同
【发布时间】:2019-08-13 21:41:35
【问题描述】:

我是 python 的绝对初学者,正在开发一个小程序来收集数据并使用 pandas 将多张工作表写入 Excel,它按预期工作。但是使用 pyinstaller 转换为 exe 文件后,它只写第一张纸。无论是在一个文件夹还是一个文件模式下。 我粘贴了可以重现问题的最少代码。 我知道我最后可以只用 writer.save() 一次,但在实际程序中,我在 for 循环中编写了多张工作表,它比最后只保存一次效率更高,并且创建的 xlsx 文件要小得多。

PyInstaller:3.4

Python:3.7.2

熊猫:0.24.2

平台:Windows-10-10.0.17763-SP0

我到处搜索问题,尝试使用 hiddenimports 为 pyinstaller 添加不同的模块,如下所示: hiddenimports=['pandas', 'pandas.io.excel', 'numpy', 'pandas.compat', 'xlsxwriter', 'openpyxl'], 它们都不起作用。

import pandas as pd

writer = pd.ExcelWriter('xlstest.xlsx')
df1 = pd.DataFrame(data=[[1, 2, 3]], columns=("a", "b", "c"))
df2 = pd.DataFrame(data=[[5, 6, 7]], columns=("d", "e", "f"))
df1.to_excel(writer, sheet_name="sheet1", index=False)
writer.save()
df2.to_excel(writer, sheet_name="sheet2", index=False)
writer.save()

【问题讨论】:

  • 您是否要创建多个 excel 文件,每个循环迭代一个?否则为什么最终文件会比在每次迭代中写入文件要小。
  • 我正在尝试在一个 Excel 文件中创建多个工作表。当我从每个循环中保存每张纸与在循环外保存一次时,最终文件的大小有很大的不同。
  • 你不应该在通话之间使用writer.save()。 XlsxWriter 不支持,并且无论如何都不需要,据我从您的示例中可以看出。如果 Pandas 使用的是 xlsxwriter(它可以选择,因为您没有明确指定它,pd.ExcelWriter('file.xlsx', engine='xlsxwriter')),那么您只会得到一个工作表。如果 Pandas 选择了 openpyxl,那么双重 save() 可能会起作用。这可能解释了两种环境之间的差异。
  • @jmcnamara 有趣
  • 你说得对,我应该指定engine='openpyxl',这样可以避免这个问题。

标签: python-3.x pandas pyinstaller


【解决方案1】:

我解决了自己的问题。我在这个项目中使用了 Pycharm。看来 pycharm 使用虚拟环境,而 pyinstaller 使用本地系统环境。因此,我尝试比较两种环境中已安装的软件包并找出可能的原因。我在两个环境中都安装了相同版本的 pandas 和 openpyxl,这让我困惑了一段时间。尝试了很多东西,最终发现是 XlsxWriter 包引起了问题。我在本地环境中安装了 XlsxWriter 1.1.5,但在 pycharm venv 中没有。一旦我 pip 从本地环境中卸载它。我编译的 exe 文件可以正常工作。

我仍在研究如何在 pycharm venv 中正确使用 pyinstaller。欢迎对此发表任何评论。

【讨论】:

    猜你喜欢
    • 2022-10-23
    • 2022-11-13
    • 1970-01-01
    • 1970-01-01
    • 2015-02-13
    • 2022-10-21
    • 2023-04-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多