Python中使用smbclient保存openpyxl操作后的Excel文件报错如何解决?
解决方案
方案1:直接将openpyxl内容写入smbclient打开的文件对象
你之前的用法存在两个核心错误:一是给save()传了文件路径,导致openpyxl会尝试用系统本地IO接口打开SMB路径文件,自然没有权限;二是你打开的是只读模式的文件,还占用了文件锁导致save()无法写入。
openpyxl的save()方法原生支持传入二进制可写文件类对象,不需要必须传路径,你可以调整流程如下:
- 先通过smbclient读取远程Excel文件到openpyxl对象完成修改
- 单独开启一个smbclient的可写上下文,直接把文件对象传给
save()
示例代码:
import smbclient from openpyxl import load_workbook smb_path = r'\\server\share\path\to\file.xlsx' # 第一步:读取远程文件到openpyxl对象,完成修改逻辑 with smbclient.open_file(smb_path, mode='rb') as f: wb = load_workbook(f) ws = wb.active # 此处执行你的Excel修改操作 ws['A1'] = '修改后内容' # 第二步:单独打开可写的smb文件对象,直接传入save方法 with smbclient.open_file(smb_path, mode='wb') as f: wb.save(f)
该方案不需要临时文件,全程走smbclient的通道操作文件,不会触发本地权限错误。
方案2:本地临时文件中转(兼容性更强)
如果你的openpyxl版本较低不支持传入文件对象,或者遇到其他兼容问题,可以用本地临时文件做中转,完成后上传覆盖远程文件:
示例代码:
import os import tempfile import smbclient from openpyxl import load_workbook smb_path = r'\\server\share\path\to\file.xlsx' # 读取远程文件并修改 with smbclient.open_file(smb_path, mode='rb') as f: wb = load_workbook(f) ws = wb.active ws['A1'] = '修改后内容' # 生成临时文件保存修改后的Excel with tempfile.NamedTemporaryFile(suffix='.xlsx', delete=False) as tmp_f: tmp_path = tmp_f.name wb.save(tmp_path) # 用smbclient的put方法上传覆盖远程文件 try: smbclient.put(tmp_path, smb_path) finally: # 删除本地临时文件 os.unlink(tmp_path)
注意事项
- 操作前请确认你使用的SMB账号对目标路径有可读、可写、可删除的权限
- 不要在同一个smbclient打开的上下文里同时执行读和写操作,避免文件锁冲突
- Windows系统下SMB路径的反斜杠需要用双反斜杠转义,或者用原始字符串标记
r
内容的提问来源于stack exchange,提问作者Mr_Pickles3
相关产品推荐
相关产品推荐

