Python ValueError:循环范围内封闭文件上的 I/O 操作

问题描述 投票:0回答:1

我有以下代码:

def openFile():
filepath = filedialog.askopenfilename(
                                      title="Please select a file",
                                      filetypes = (('Excel files', '*.xlsx'),
                                                  ('Excel macro files', '*.xlsm'))
                                      )
                                                                    
    file = open(filepath, 'r')
    wb = load_workbook(filepath, read_only=False, keep_vba=True)
    ws=wb.active
    fileonly = filepath.split('/')[-1]
    filewithoutextension = fileonly.split('-')[0]
    fileextension = fileonly.split('.')[-1]

    y = pyautogui.prompt(text='Please specify the number of file duplicates', title='Number of files', default='2')

    file_path = filedialog.askdirectory()

    print(y)

    for x in range(2, (int(y))+1):
         newname = "%03d" % x
         dv = DataValidation(type="list", formula1='"COLLECTION,INTER PROJECT COLLECTION,INTER PROJECT TRANSFER,TRANSFER"', allow_blank=False)
         dv.error = 'Please select entry from the list!'
         c1 = ws["D4"]
         c1.value = "COLLECTION"
         dv.add(c1)
         ws.add_data_validation(dv)
         save_path = Path(file_path) / f"{filewithoutextension}- {newname}.{fileextension}"
         wb.save(save_path)
         print (filewithoutextension+'- '+newname+'.'+fileextension)
         wb.close()


rootwindow = tk.Tk()
rootwindow.geometry("500x100")
rootwindow.title("Excel file duplicator")
font.families()
windowfont=tk.font.nametofont("TkDefaultFont")
windowfont.config(
    family="Segoe Script",
    size=24,
    weight=font.BOLD)

button = tk.Button(rootwindow, text='Open Excel 
document',command=openFile, fg='black', bg='yellow')
button.pack()
rootwindow.mainloop()

这会引发以下错误:

ValueError:对已关闭文件进行 I/O 操作。

尝试使用代码中包含的 file.close() 和其他解决方案(此处列出),但它们不起作用。

Python 错误:Python ValueError:对已关闭文件进行 I/O 操作

ValueError:对已关闭文件进行 I/O 操作

我如何将它们应用到这样的情况,即在多个文件之间有一个循环而不是文件?

更新:

以前,我在使用 openpyxl 复制的文件保存图像时遇到了问题。 通过使用以下解决方案: 使用 python 复制 Excel 文档时图像消失 我已经安装了 Pillow 库。安装后就出现这个错误。

python tkinter openpyxl
1个回答
0
投票

您的代码为我运行,并且基本上实现了您可能试图通过几个小问题实现的目标。

我没有有任何“ValueError:已关闭文件上的 I/O 操作”错误,并且没有看到引发此错误的任何特定原因。

我已经浏览了代码以突出显示我看到的问题。
下面列出了这些,它们都不是主要的或会导致运行时错误。

  1. file = open(filepath, 'r')
    是无关的,包含它是没有意义的。不需要在 Excel 文件上打开句柄,Openpyxl 不需要它,而且您也不会在代码中的任何地方使用它。
  2. 您选择 Excel 文件、XLSX 或 Excel 宏文件 XLSM,该文件由 Openpyxl 使用
    keep_vba=True
    加载,然后使用原始扩展名保存。
    这意味着 XLSX 文件可以使用
    keep_vba=True
    打开并以“.xlsx”扩展名保存。这将导致 Excel 无法打开不匹配的文件。使用
    keep_vba=True
    时,工作簿现在是 Excel 宏工作簿,并且必须使用扩展名“.xlsm”。
    文件保存后没问题,但 Excel 只能在更改扩展名后才能打开它们。
  3. 获取不带扩展名的文件Excel文件名的行是错误的
    filewithoutextension = fileonly.split('-')[0]
    应该是
    filewithoutextension = fileonly.split('.')[0]
    。分隔符位于下一行,用于获取 Excel 文件扩展名。
  4. “文件数量”对话框是“请指定文件重复数量”,这表明它询问要制作所选文件的多少个副本。然而,您用于创建副本的范围比这个小一。
    您以值 2 开始范围,但仅向用作范围中最大值的输入值添加 1。因此,如果用户选择默认值“2”,则范围为
    range(2, 3)
    ,因此循环将仅在“x”等于 2 时迭代一次。
    假设您想要迭代 2 次,因此范围应为
    range(2, (int(y)) + 2)
    ,因此对于我们的示例,它是
    range(2, 4)
    ,并且 x 的值为 2 和 3。
  5. 方法
    wb.close()
    对于工作簿的打开方式没有影响。我不知道为什么你想在此时关闭它,但是
    wb.close()
    只影响以读或写方式打开的工作簿,而你还没有这样做。
© www.soinside.com 2019 - 2024. All rights reserved.