Python写入Excel报Sharing Violation共享违规错误问题求助
问题原因
你现在遇到的文件占用问题来自三个明确的代码错误,和网上说的with语句、close方法本身失效没关系:
- 代码里写的
writer.close没有加括号,根本没有执行close方法,只是拿到了方法的引用,等于这句完全没生效 - 你额外单独调用
openpyxl.load_workbook(output_file)打开了一个独立的工作簿实例,这个实例持有的文件句柄从来没有被关闭,就算你把它赋值给writer.book,pandas也不会接管这个外部加载实例的生命周期,writer关闭的时候碰不到这个实例的锁 - 手动设置
writer.handles = None是无效操作,这个属性是pandas内部维护的引用,根本接触不到openpyxl内核层持有的文件句柄,改了也释放不了锁
修复方案
推荐写法(无额外句柄泄漏风险)
不要单独调用load_workbook,直接使用ExcelWriter初始化后自带的writer.book实例,配合with语句自动管理生命周期,从根源避免多开句柄:
import pandas as pd with pd.ExcelWriter( output_file, engine='openpyxl', mode='a', if_sheet_exists='replace' ) as writer: book = writer.book outputfile(writer, book, final_data, list_name[i], False, False, "C1", 2, "C", 16, 30, 12, "A","B") outputfile(writer, book, df_transposed, sheetposed, True, False, "B2",1, "B", 20, 10, 10, "A","A") # with块退出时会自动完成save、close全流程,不需要手动调用
兼容旧逻辑的写法(必须单独加载workbook时用)
如果你的业务逻辑必须提前单独加载workbook,必须按顺序关闭所有持锁对象,手动释放引用并触发垃圾回收:
import gc import pandas as pd import openpyxl writer = None book = None try: writer = pd.ExcelWriter(output_file, engine='openpyxl', mode='a') book = openpyxl.load_workbook(output_file) writer.book = book outputfile(writer, book, final_data, list_name[i], False, False, "C1", 2, "C", 16, 30, 12, "A","B") outputfile(writer, book, df_transposed, sheetposed, True, False, "B2",1, "B", 20, 10, 10, "A","A") writer.save() finally: # 按顺序关闭所有持锁对象,注意close必须加括号才是执行 if book: book.close() if writer: writer.close() # 删除对象引用,强制垃圾回收立刻释放句柄 del book, writer gc.collect()
修复完成后,代码运行到上述逻辑块之外时,文件锁会被彻底释放,此时手动编辑Excel保存不会再触发共享违规错误。不要依赖手动修改内部属性的偏方,不同pandas、openpyxl版本的内部实现差异很大,很容易失效。
内容的提问来源于stack exchange,提问作者Scott94
相关产品推荐
相关产品推荐

