negin12 发表于 2023-9-8 17:28:16

I/O operation on closed file.

求助求助,代码如下:

wb1=openpyxl.load_workbook(p1)
ws1=wb1.worksheets
wb=openpyxl.load_workbook(p2)
ws=wb.worksheets
r=1
for j in range(18,ws1.max_row):
    for i in ws['B']:
      if i.value==ws1['U' + str(j)].value:
            image=ws._images
            image.height = 60
            image.width = 60
            ws1.row_dimensions.height = 50
            ws1.row_dimensions.width = 50
            ws1.add_image(image, 'Q' + str(j))
            ws1['U' + str(j)].value=''
            break
wb1.save(p1)

报错:
wb1.save(r'C:\Users\Administrator\Desktop\1.xlsx')
File "C:\Users\Administrator\AppData\Local\Programs\Python\Python311\Lib\site-packages\openpyxl\workbook\workbook.py", line 386, in save
    save_workbook(self, filename)
File "C:\Users\Administrator\AppData\Local\Programs\Python\Python311\Lib\site-packages\openpyxl\writer\excel.py", line 294, in save_workbook
    writer.save()
File "C:\Users\Administrator\AppData\Local\Programs\Python\Python311\Lib\site-packages\openpyxl\writer\excel.py", line 275, in save
    self.write_data()
File "C:\Users\Administrator\AppData\Local\Programs\Python\Python311\Lib\site-packages\openpyxl\writer\excel.py", line 79, in write_data
    self._write_images()
File "C:\Users\Administrator\AppData\Local\Programs\Python\Python311\Lib\site-packages\openpyxl\writer\excel.py", line 116, in _write_images
    self._archive.writestr(img.path, img._data())
                                       ^^^^^^^^^^^
File "C:\Users\Administrator\AppData\Local\Programs\Python\Python311\Lib\site-packages\openpyxl\drawing\image.py", line 48, in _data
    img = _import_image(self.ref)
          ^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\Administrator\AppData\Local\Programs\Python\Python311\Lib\site-packages\openpyxl\drawing\image.py", line 16, in _import_image
    img = PILImage.open(img)
          ^^^^^^^^^^^^^^^^^^
File "D:\pyoby\venv\Lib\site-packages\PIL\Image.py", line 3240, in open
    fp.seek(0)
ValueError: I/O operation on closed file.

isdkz 发表于 2023-9-8 17:28:27

这个错误是由于在保存工作簿时,尝试写入图像数据时出错。错误的原因是图像对象所引用的文件已经关闭。

这个问题可能是由于在打开图像文件时,没有正确地关闭文件对象所导致的。为了解决这个问题,你可以尝试在使用完图像对象后,显式地关闭文件对象。

你可以修改代码如下:

wb1.save(p1)
wb1.close()# 添加这一行代码来关闭文件对象


这样,当保存工作簿时,相关的文件对象将被正确地关闭,避免了"ValueError: I/O operation on closed file"错误的发生。

Mike_python小 发表于 2023-9-8 17:28:40

根据您提供的代码和错误信息,问题可能出在 openpyxl 库中读取图像数据时发生了错误。具体来说,报错指出在尝试从文件中读取图像数据时,文件已关闭。

可以尝试以下解决方案:

1. 确保图像文件存在:检查代码中用于读取图像数据的路径是否正确,并确保图像文件存在。

2. 检查文件打开方式:确认在读取图像文件之前,文件是以可读模式打开的。可以使用 with open() 语句来确保文件在读取完毕后自动关闭。

3. 检查图像格式:确保图像文件的格式受 openpyxl 支持。常见支持的图像格式包括 JPEG、PNG、BMP 等。

4. 更新相关库:尝试更新 openpyxl 和 PIL(或 pillow)库到最新版本,以确保使用的是最新的修复bug的版本。

5. 使用绝对路径:尝试使用绝对路径来访问图像文件,而不是相对路径。

6. 检查文件状态:如果在读取图像之前有其他操作修改了文件的状态或关闭了文件,请确保在读取图像之前文件处于正确打开的状态。

请根据以上建议逐一排查问题,并进行相应的修改。如果问题仍然存在,请提供更多上下文信息,以便我能够更好地帮助您解决问题。

球一个最佳答案谢谢啦!这对我非常重要!{:10_254:}{:10_254:}{:10_254:}

negin12 发表于 2023-9-8 17:48:04

isdkz 发表于 2023-9-8 17:28
这个错误是由于在保存工作簿时,尝试写入图像数据时出错。错误的原因是图像对象所引用的文件已经关闭。

...

试过了,没有用。尝试了每次在需要写入图像的时候,再打开一次,解决了。
页: [1]
查看完整版本: I/O operation on closed file.