Openpyxl中workbook.close()无法关闭文件致shutil.move报错求助
Openpyxl调用close()后仍无法释放文件锁,导致shutil.move权限错误
我用openpyxl向xlsx文件写入内容并保存,之后需要用shutil.move移动该文件,但必须先关闭文件,否则会触发权限错误。调用book.close()后文件仍未真正关闭,试过切换读写模式、改用pandas/xlwings(但因格式需求优先用openpyxl)都没解决。
我的写入保存代码如下:
def savetocell(r,col,val,file,sheet): from openpyxl import load_workbook book = load_workbook(file) page = book[sheet] page.cell(row = r,column=col+1,value=val) book.save(file) book.close()
查看openpyxl的close()源码后发现问题:这个方法只在只读(read-only)或只写(write-only)模式下才会关闭文件(因为只有这两种模式下工作簿才有_archive属性),默认常规模式加载的工作簿不会触发实际的文件关闭操作,导致文件句柄没释放:
def close(self): """ Close workbook file if open. Only affects read-only and write-only modes. """ if hasattr(self, '_archive'): self._archive.close()
解决方法
优先用上下文管理器(with语句)
上下文管理器会自动在代码块结束时释放资源,即使出异常也能确保文件正确关闭,这是最稳妥的方式:def savetocell(r, col, val, file, sheet): from openpyxl import load_workbook with load_workbook(file) as book: page = book[sheet] page.cell(row=r, column=col+1, value=val) book.save(file) # 离开with块后直接调用shutil.move就行,文件已经释放手动触发垃圾回收(特殊场景用)
如果上下文管理器不合适,可以手动删除工作簿对象并强制垃圾回收,释放文件句柄:def savetocell(r, col, val, file, sheet): from openpyxl import load_workbook import gc book = load_workbook(file) page = book[sheet] page.cell(row=r, column=col+1, value=val) book.save(file) book.close() del book gc.collect()检查外部进程占用
确认没有其他程序(比如Excel客户端)打开这个文件,外部进程占用也会导致权限错误。
内容的提问来源于stack exchange,提问作者Brianna D
相关产品推荐
相关产品推荐

