葡萄园I 2022-08-11 21:07 采纳率: 100%
浏览 79
已结题

python用openpyxl保存excel时出现OSError: [Errno 9] Bad file descriptor,如何解决?

问题遇到的现象和发生背景

之前一直没有问题,但最近突然就这样了,我把这段写在一个单独的py文件里,依然是报错

问题相关代码,请勿粘贴截图

import openpyxl
workbook = openpyxl.load_workbook('数据.xlsx') # 返回一个workbook数据类型的值
sheet = workbook.active # 获取活动表
sheet['A1'] = 20 # 获取活动表
workbook.save('数据.xlsx')

运行结果及报错内容

Traceback (most recent call last):
File "C:/Users/M/Desktop/DQN/123.py", line 6, in
workbook.save('数据.xlsx')
OSError: [Errno 9] Bad file descriptor
Exception ignored in: <function ZipFile.__del__ at 0x0000023F7E028948>

  • 写回答

2条回答 默认 最新

  • upc-nlp 2022-08-11 23:13
    关注

    代码本身测试:
    这个代码在本地新建环境下使用是正常的
    错误解析:

    1. OSError: [Errno 9] Bad file descriptor
    2. Bad file descriptor 错误的文件描述符--代表:当代码尝试对已关闭(未打开)的文件执行操作/活动时,会生成错误的文件描述符错误

    解决错误的思路:

    1. 重启电脑排除其他应用程序导致的错误
    2. 配置一个新的虚拟环境,确定是否由环境配置错误、包之间的冲突、版本问题等
    3. 寻找此文件是否在其他代码中被使用或者重复关闭

    源码查找:

    1. workbook.save函数
      # https://openpyxl.readthedocs.io/en/latest/_modules/openpyxl/writer/excel.html#save_workbook
      def save_workbook(workbook, filename):
       archive = ZipFile(filename, 'w', ZIP_DEFLATED, allowZip64=True)
       writer = ExcelWriter(workbook, archive)
       writer.save()
       return True
      
    2. 涉及到的可能的关闭操作:
    # https://openpyxl.readthedocs.io/en/latest/_modules/openpyxl/writer/excel.html#save_workbook
    class ExcelWriter(object):
       def save(self):
            """Write data into the archive."""
            self.write_data()
            self._archive.close()
    # 涉及到标准库 zipfile的使用:https://docs.python.org/zh-cn/3/library/zipfile.html
    # https://github.com/python/cpython/blob/3.10/Lib/zipfile.py
    def close(self):
            """Close the file, and for mode 'w', 'x' and 'a' write the ending
            records."""
            if self.fp is None:
                return
    
            if self._writing:
                raise ValueError("Can't close the ZIP file while there is "
                                 "an open writing handle on it. "
                                 "Close the writing handle before closing the zip.")
    
            try:
                if self.mode in ('w', 'x', 'a') and self._didModify: # write ending records
                    with self._lock:
                        if self._seekable:
                            self.fp.seek(self.start_dir)
                        self._write_end_record()
            finally:
                fp = self.fp
                self.fp = None
                self._fpclose(fp)
    

    根据提供的信息,大概能分析出这些信息,希望对你有帮助。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 8月20日
  • 已采纳回答 8月12日
  • 创建了问题 8月11日

悬赏问题

  • ¥20 wireshark抓不到vlan
  • ¥20 关于#stm32#的问题:需要指导自动酸碱滴定仪的原理图程序代码及仿真
  • ¥20 设计一款异域新娘的视频相亲软件需要哪些技术支持
  • ¥15 stata安慰剂检验作图但是真实值不出现在图上
  • ¥15 c程序不知道为什么得不到结果
  • ¥40 复杂的限制性的商函数处理
  • ¥15 程序不包含适用于入口点的静态Main方法
  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来