将 pandas 数据帧导出到 xlsx:处理 python 3.9 上的 openpyxl 问题

2024-07-04

使用最新的软件包版本:openpyxl:3.0.6 |熊猫:1.2.3 |蟒蛇:3.9

在将上面的软件包更新到报告的最新版本之前,下面的功能运行良好。

现在它会引发错误:“zipfile.BadZipFile:文件不是 zip 文件”。

这样的功能确实很有用,并且很高兴知道它是否可以修复以使其正常工作。

下面的函数可以直接运行,只需将“pathExport”替换为您的导出目录进行测试即可。

    def append_df_to_excel(filename, df, sheet_name='Sheet1', startrow=None,
                           truncate_sheet=False, 
                           **to_excel_kwargs):
        """
        Append a DataFrame [df] to existing Excel file [filename]
        into [sheet_name] Sheet.
        If [filename] doesn't exist, then this function will create it.
    
        Parameters:
          filename : File path or existing ExcelWriter
                     (Example: '/path/to/file.xlsx')
          df : dataframe to save to workbook
          sheet_name : Name of sheet which will contain DataFrame.
                       (default: 'Sheet1')
          startrow : upper left cell row to dump data frame.
                     Per default (startrow=None) calculate the last row
                     in the existing DF and write to the next row...
          truncate_sheet : truncate (remove and recreate) [sheet_name]
                           before writing DataFrame to Excel file
          to_excel_kwargs : arguments which will be passed to `DataFrame.to_excel()`
                            [can be dictionary]
    
        Returns: None
    
        (c) [MaxU](https://stackoverflow.com/users/5741205/maxu?tab=profile)
        """
        from openpyxl import load_workbook
    
        # ignore [engine] parameter if it was passed
        if 'engine' in to_excel_kwargs:
            to_excel_kwargs.pop('engine')
    
        writer = pd.ExcelWriter(filename, engine='openpyxl')
    
        # Python 2.x: define [FileNotFoundError] exception if it doesn't exist 
        try:
            FileNotFoundError
        except NameError:
            FileNotFoundError = IOError
    
    
        try:
            # try to open an existing workbook
            writer.book = load_workbook(filename)
            
            # get the last row in the existing Excel sheet
            # if it was not specified explicitly
            if startrow is None and sheet_name in writer.book.sheetnames:
                startrow = writer.book[sheet_name].max_row
    
            # truncate sheet
            if truncate_sheet and sheet_name in writer.book.sheetnames:
                # index of [sheet_name] sheet
                idx = writer.book.sheetnames.index(sheet_name)
                # remove [sheet_name]
                writer.book.remove(writer.book.worksheets[idx])
                # create an empty sheet [sheet_name] using old index
                writer.book.create_sheet(sheet_name, idx)
            
            # copy existing sheets
            writer.sheets = {ws.title:ws for ws in writer.book.worksheets}
        except FileNotFoundError:
            # file does not exist yet, we will create it
            pass
    
        if startrow is None:
            startrow = 0
    
        # write out the new sheet
        df.to_excel(writer, sheet_name, startrow=startrow, **to_excel_kwargs)
    
        # save the workbook
        writer.save()

pathExport = r"F:\PYTHON\NB-Suite_python39\MNE\outputData\df.xlsx"
df1 = pd.DataFrame({'numbers': [1, 2, 3],
                    'colors': ['red', 'white', 'blue'],
                    'colorsTwo': ['yellow', 'white', 'blue']
                    })

append_df_to_excel(pathExport, df1, sheet_name="DF1", index=False, startcol=0, startrow=0)

好的,我能够复制这个问题。这是pandas有关的。 pandas 1.1.5 之前一切正常 在 pandas 1.2.0 中他们做到了一些变化 https://pandas.pydata.org/docs/whatsnew/v1.2.0.html

当你实例化的时候pd.ExcelWriter with

writer = pd.ExcelWriter(filename, engine='openpyxl')`

它会创建大小为 0 字节的空文件并覆盖现有文件,然后在尝试加载它时会出现错误。它不是openpyxl相关,因为最新版本的openpyxl它与 pandas 1.1.5 配合良好。

解决方案 - 指定mode='a',将上面的行更改为

writer = pd.ExcelWriter(filename, engine='openpyxl', mode='a')

或者 - 看看this https://stackoverflow.com/a/66472617/4046632 or this https://stackoverflow.com/a/20221655/4046632解决方案在实例化之前加载文件pd.ExcelWriter.

编辑:我在评论中被告知mode='a'如果文件不存在,它将引发 FileNotFoundError。虽然在这种情况下它不会创建文件是出乎意料的,但解决方案是移动创建writer现有的内部try阻止并创建一个writer与模式w in the except part:

def append_df_to_excel(filename, df, sheet_name='Sheet1', startrow=None,
                           truncate_sheet=False, 
                           **to_excel_kwargs):
        """
        Append a DataFrame [df] to existing Excel file [filename]
        into [sheet_name] Sheet.
        If [filename] doesn't exist, then this function will create it.
     
        Parameters:
          filename : File path or existing ExcelWriter
                     (Example: '/path/to/file.xlsx')
          df : dataframe to save to workbook
          sheet_name : Name of sheet which will contain DataFrame.
                       (default: 'Sheet1')
          startrow : upper left cell row to dump data frame.
                     Per default (startrow=None) calculate the last row
                     in the existing DF and write to the next row...
          truncate_sheet : truncate (remove and recreate) [sheet_name]
                           before writing DataFrame to Excel file
          to_excel_kwargs : arguments which will be passed to `DataFrame.to_excel()`
                            [can be dictionary]
     
        Returns: None
     
        (c) [MaxU](https://stackoverflow.com/users/5741205/maxu?tab=profile)
        """
        from openpyxl import load_workbook
     
        # ignore [engine] parameter if it was passed
        if 'engine' in to_excel_kwargs:
            to_excel_kwargs.pop('engine')
     
        
     
        # Python 2.x: define [FileNotFoundError] exception if it doesn't exist 
        try:
            FileNotFoundError
        except NameError:
            FileNotFoundError = IOError
     
     
        try:
            writer = pd.ExcelWriter(filename, engine='openpyxl', mode='a')
            # try to open an existing workbook
            writer.book = load_workbook(filename)
             
            # get the last row in the existing Excel sheet
            # if it was not specified explicitly
            if startrow is None and sheet_name in writer.book.sheetnames:
                startrow = writer.book[sheet_name].max_row
     
            # truncate sheet
            if truncate_sheet and sheet_name in writer.book.sheetnames:
                # index of [sheet_name] sheet
                idx = writer.book.sheetnames.index(sheet_name)
                # remove [sheet_name]
                writer.book.remove(writer.book.worksheets[idx])
                # create an empty sheet [sheet_name] using old index
                writer.book.create_sheet(sheet_name, idx)
             
            # copy existing sheets
            writer.sheets = {ws.title:ws for ws in writer.book.worksheets}
        except FileNotFoundError:
            # file does not exist yet, we will create it
            writer = pd.ExcelWriter(filename, engine='openpyxl')
     
        if startrow is None:
            startrow = 0
     
        # write out the new sheet
        df.to_excel(writer, sheet_name, startrow=startrow, **to_excel_kwargs)
     
        # save the workbook
        writer.save()
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将 pandas 数据帧导出到 xlsx:处理 python 3.9 上的 openpyxl 问题 的相关文章

随机推荐

  • C# 奇怪的精度丢失 int 到浮动和向后

    当尝试从 int 转换为 float 并向后转换时 会发生奇怪的事情 原始示例代码 整数值 28218681 val 28218681 浮点 fVal 浮点 val fVal 2 821868E 07 int val2 int fVal v
  • PHP SQLSRV:sqlsrv_query() 是否可以正确地准备 select 语句?

    TL DR Does sqlsrv query 做同样的工作select陈述比sqlsrv prepare and sqlsrv execute 关于准备好的陈述 做什么 我怎样才能做一个安全的select陈述 一点历史 我是 PHP 开发
  • Opencv 3D 来自立体对中的点

    OpenCV 中是否有一个简单的函数可以从立体相机对中获取对象的 3D 位置和姿态 我用棋盘校准了相机和基线 我现在想要获取一个已知的物体 就像同一个棋盘一样 在它自己的坐标中具有已知的 3D 点 并找到真实世界的位置 在相机坐标中 有一些
  • 在 Visual Studio 中启动 Web API 项目的最简洁方法(无视图)

    删除 Visual Studio API 模板通常附带的所有额外内容 如视图和其他如果您只想拥有 WebAPI 服务则不需要的内容 的最干净方法是什么 我假设 VIEWS 文件夹用于 MVC 视图 也许我错了 它需要有一个正在运行的 API
  • Python就地写入文件任意位置

    我正在尝试在 python 中就地编辑文本文件 它非常大 因此无法将其加载到内存中 我打算替换我在里面找到的逐字节字符串 with f as open filename txt r b if f read 8 01234567 f seek
  • UIWebView 中自动填充用户名和密码

    我正在为我做一个非常简单的应用程序 当我启动这个应用程序时 它只会将我带到这个网页https social tre it expert https social tre it expert 我想自动登录 那么有没有办法自动填写用户名和密码
  • Java中等待的最佳方式

    我有一个应用程序需要等待一段未知的时间 它必须等到服务器完成几个数据字段的填充 服务器的 API 为我提供了一种请求数据的方法 非常简单 服务器的 API 还提供了一种接收回数据的方法 一次接收一个字段 它没有告诉我所有字段何时完成填充 等
  • 如何按字母顺序对单键字典数组进行排序?

    我想对 Facebook 的 Graph API 返回的好友列表进行排序 排序后的结果需要是按好友名字的字母顺序排列 name Joe Smith id 6500000 name Andrew Smith id 82000 name Dor
  • ActiveRecord 触摸导致死锁

    我的应用程序使用touch广泛地利用 Rails 的模板缓存系统 当批量中的许多不同对象之间创建许多关系时 我的应用程序会执行某种类型的工作 有时 其中一些工作会导致级联touches 导致死锁 我可以针对这种情况进行编码 我经常看到这种情
  • Instagram 如何命名文件

    Instagram 如何命名文件 文件名是随机的吗 基于某种哈希 或者它们有什么意义吗 例如 http distilleryimage2 instagram com 21a9ca729bf511e2985c22000a1f9ad3 7 jp
  • 为什么这个简单的洗牌算法(通过 random() 排序)存在偏差?

    In 这个线程 https stackoverflow com a 18650169 17102262我们看到这个简单而漂亮的算法来洗牌数组 function shuffle
  • 限制 Webstorm 中的重构范围

    有没有一种方法可以配置 Webstorm 以便在重构时忽略我项目的特定区域 具体来说 我希望能够忽略包含第 3 方依赖项和构建资产的文件夹 例如 node modules 您可以按照描述创建这些文件夹的 JavaScript 库here h
  • 如何在ggplot2图例标签中添加Latex代码?

    考虑以下示例 p lt ggplot data data frame A c 1 2 3 4 5 6 7 8 B c 4 1 2 1 3 2 4 1 C c A B A B A B A B p lt p geom line aes x A
  • 为什么 BITMAPS 加载“向上”?

    如果您有一个非常非常大的 JPG 和嵌入 HTML 的 BMP 并将其加载到 Firefox 中 您会注意到 JPG 将 向下 加载 从左到右绘制 然后向下 而 BMP 将 向上 加载 从右向左绘画 然后向上 只是好奇 我不久前写了一个位图
  • 更改引导程序中单击按钮的颜色

    我正在尝试更改单击按钮的颜色 我正在蓝色的 Bootstrap 按钮上执行此操作 但我的代码不起作用 我的 JavaScript 代码如下 它没有改变颜色
  • jqGrid - 未应用日期和时间格式

    我有一个显示 3 列的 jqGrid 其中一列是日期时间 正在返回的 SQL 日期时间字段 colModel 设置如下 colModel name col1 sortable false name col2 sortable false n
  • 我可以分享到我的 NativeScript 应用程序吗?

    在 NativeScript 的当前状态下 是否可以创建一个在 Android 上侦听共享意图的应用程序 我想要实现的是 例如在 Android 上的网络浏览器中打开一个网站 点击共享并在共享目标列表中查看我的 NativeScript 应
  • 如何隐藏 html 表格中的多行(数千行)

    我有很多行的 html 页面 大约 40000 table tr td row 1 td tr tr td row 2 td tr tr td row 30000 td tr table 我需要一种快速的方法来隐藏 显示具有指定名称的行集
  • 如何修复 emacs 中的“正则表达式匹配器中的堆栈溢出”

    我是 Emacs 的忠实粉丝 并且经常使用它 尤其是在编程和调试 使用 gud C C 时 最近我必须调试一个程序 相当简单 但需要计算大量数据 图论 但我遇到了一个相当烦人的问题 在程序逐步执行过程中 出现以下错误 error in pr
  • 将 pandas 数据帧导出到 xlsx:处理 python 3.9 上的 openpyxl 问题

    使用最新的软件包版本 openpyxl 3 0 6 熊猫 1 2 3 蟒蛇 3 9 在将上面的软件包更新到报告的最新版本之前 下面的功能运行良好 现在它会引发错误 zipfile BadZipFile 文件不是 zip 文件 这样的功能确实